tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
11
ZUGRIFFE
766
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Anime-Otaku Anime-Otaku ist offline Mitglied Brillant
    Registriert seit
    Aug 2005
    Ort
    Karlsruhe (Baden-Württemberg)
    Beiträge
    905
    Hallo,

    ich komme eigentlich aus der Java-ecke will aber zu C/C++ gehen. Ich hab da mal angefangen ein kleines Java Progrämmchen nach C zu portieren. Momentan soll es nur jedes eingelesene Zeichen wieder als Zeichen auf der Konsole ausgeben.

    Das kommt raus wenn ich den Sourcecode(siehe unten) dazu versuche einzulesen:
    Code :
    1
    2
    3
    4
    5
    6
    
    D:\blub\src>.\bin.exe main.c lol
    ☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺
    ☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺
    ☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺
    ☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺
    ☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺

    Ich benutze den gcc Compiler.

    Dies ist der src dazu:
    Code c:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(int argc, char *argv[]);
    int printHelp(const char* mes);
     
    int main(int argc, char *argv[]) {
        if (argc!=3 || strcmp(argv[1],"")==0 || strcmp(argv[2],"")==0 ) {
            printHelp("Didn't found any arguments");
            return 1;
        }
        FILE *fp;
        char cha=0;
        if (fp=fopen(argv[1],"rt")) {
            while(cha=fgetc(fp)!=EOF){
                printf("%c",cha);
            }
            puts("");
     
            if (fclose(fp)==EOF) {
            printf("\nFehler beim Schließen der Datei %s!\n",argv[1]);
            return -1;
            }
        } else {
            printf("\nFehler beim Öffnen der Datei %s!\n",argv[1]);
            return -1;
           }
        }
     
    int printHelp(const char* mes){
        printf("%s\nUse: bin [input file] [output file]\n",mes);
        return 0;
    }

    Vielen Dank schonmal für die Hilfe
     
    Wäre super wenn ihr euren Code in dieser Form einfügt:
    Code java:
    1
    
    System.out.println("Hello World");
    [java]System.out.println("Hello World");[/java]
    Für erledigte Threads dürft ihr den "erledigt"-Button anklicken!
    Über Dank freut sich jeder, der euch geholfen hat - ein Klick auf "Danke" kostet ja nicht mal was
    Blog: http://javaeffective.wordpress.com/

  2. #2
    Registriert seit
    Mar 2004
    Beiträge
    441
    Na herzlichen Glückwunsch, da scheint ja alles zu funktionieren.
     

  3. #3
    Anime-Otaku Anime-Otaku ist offline Mitglied Brillant
    Registriert seit
    Aug 2005
    Ort
    Karlsruhe (Baden-Württemberg)
    Beiträge
    905
    Warum krieg ich dann so komische Zeichen ausgegeben und nicht den Text?
     
    Wäre super wenn ihr euren Code in dieser Form einfügt:
    Code java:
    1
    
    System.out.println("Hello World");
    [java]System.out.println("Hello World");[/java]
    Für erledigte Threads dürft ihr den "erledigt"-Button anklicken!
    Über Dank freut sich jeder, der euch geholfen hat - ein Klick auf "Danke" kostet ja nicht mal was
    Blog: http://javaeffective.wordpress.com/

  4. #4
    Registriert seit
    Mar 2004
    Beiträge
    441
    Weil ich keine Ahnung habe, was in deiner Textdatei steht.
     

  5. #5
    Anime-Otaku Anime-Otaku ist offline Mitglied Brillant
    Registriert seit
    Aug 2005
    Ort
    Karlsruhe (Baden-Württemberg)
    Beiträge
    905
    Zitat Zitat von Anime-Otaku
    Das kommt raus wenn ich den Sourcecode(siehe unten) dazu versuche einzulesen:
     
    Wäre super wenn ihr euren Code in dieser Form einfügt:
    Code java:
    1
    
    System.out.println("Hello World");
    [java]System.out.println("Hello World");[/java]
    Für erledigte Threads dürft ihr den "erledigt"-Button anklicken!
    Über Dank freut sich jeder, der euch geholfen hat - ein Klick auf "Danke" kostet ja nicht mal was
    Blog: http://javaeffective.wordpress.com/

  6. #6
    Registriert seit
    Mar 2004
    Beiträge
    441
    Narf, es ist echt noch zu früh am Morgen.

    Also das erste, was mich stutzig macht, ist der Parameter des fopen, das "rt". "r" für "read" leuchtet mir ein, aber was soll das "t" bedeuten?
    Ansonsten wird es ohne Debugger knifflig. Ich will es nicht verschreien, aber das sieht für mich nach einem Konvertierungsproblem zwischen Windows-Zeichensatz und ASCII aus. Muß das mal evtl. selber nachprüfen.
     

  7. #7
    Anime-Otaku Anime-Otaku ist offline Mitglied Brillant
    Registriert seit
    Aug 2005
    Ort
    Karlsruhe (Baden-Württemberg)
    Beiträge
    905
    t steht für text, wobei wenn das t weggelassen wird ist es das selbe.
     
    Wäre super wenn ihr euren Code in dieser Form einfügt:
    Code java:
    1
    
    System.out.println("Hello World");
    [java]System.out.println("Hello World");[/java]
    Für erledigte Threads dürft ihr den "erledigt"-Button anklicken!
    Über Dank freut sich jeder, der euch geholfen hat - ein Klick auf "Danke" kostet ja nicht mal was
    Blog: http://javaeffective.wordpress.com/

  8. #8
    Registriert seit
    Mar 2004
    Beiträge
    441
    Ok, ich kenne es nur ohne "t". Höchstens noch "b" für binary. Dann mal eine kurze Frage:
    Du schreibst, daß du den gcc benutzt, aber die Syntax des Aufrufs sieht sehr nach Windows aus. Auf was für einer Plattform arbeitest du? Evtl. kann ich das Programm mal kurz nachbauen und schauen, was passiert.
     

  9. #9
    Anime-Otaku Anime-Otaku ist offline Mitglied Brillant
    Registriert seit
    Aug 2005
    Ort
    Karlsruhe (Baden-Württemberg)
    Beiträge
    905
    Ja momentan arbeite ich auf nem windows Rechner, aber ich will es auch unter Linux zum laufen bekommen, aber ich hatte noch keine Gelegenheit es zu testen.

    Ich benutze den GCC Compiler aus dem MingW Projekt. Version 3.4.2, welcher bei Dev-cpp dabei ist.
     
    Wäre super wenn ihr euren Code in dieser Form einfügt:
    Code java:
    1
    
    System.out.println("Hello World");
    [java]System.out.println("Hello World");[/java]
    Für erledigte Threads dürft ihr den "erledigt"-Button anklicken!
    Über Dank freut sich jeder, der euch geholfen hat - ein Klick auf "Danke" kostet ja nicht mal was
    Blog: http://javaeffective.wordpress.com/

  10. #10
    Registriert seit
    Mar 2004
    Beiträge
    441
    Ok, ich hab's rausgefunden, war etwas fieser.
    Der Wurm liegt hier:
    Code :
    1
    2
    
    while(cha=fgetc(fp)!=EOF){
      printf("%c",cha);
    Was du machen willst ist:
    cha den Character aus dem Stream zuweisen und dann mit EOF vergleichen.
    Was tatsächlich passiert:
    Der Character aus dem Stream wird mit EOF verglichen und cha wird das Vergleichsergebnis zugewiesen.

    Deswegen bin ich auch kein sonderlicher Freund von solchen Superkurzschreibweisen.
    Dieser Code funktioniert:
    Code :
    1
    2
    3
    4
    5
    6
    7
    
    if (fp=fopen(argv[1],"r")) {
      while(cha!=EOF){
        cha=fgetc(fp);
        printf("%c",cha);
      }
      puts("");
    ...

    Nicht zuviel kürzen, dann kommt man auch nicht mit den Auswertungsprioritäten in Konflikt.
     

  11. #11
    Anime-Otaku Anime-Otaku ist offline Mitglied Brillant
    Registriert seit
    Aug 2005
    Ort
    Karlsruhe (Baden-Württemberg)
    Beiträge
    905
    Funktioniert

    Das erklärt warum er ASCI 0001 rausgeschrieben hat.

    Vielen Dank

    naja ne Klammer hätte es auch getan:
    Code c:
    1
    2
    3
    4
    5
    
    if (fp=fopen(argv[1],"rt")) {
            while( (cha=fgetc(fp) ) != EOF){
                printf("%c",cha);
            }
            puts("");
    Geändert von Anime-Otaku (21.09.06 um 10:19 Uhr)
     
    Wäre super wenn ihr euren Code in dieser Form einfügt:
    Code java:
    1
    
    System.out.println("Hello World");
    [java]System.out.println("Hello World");[/java]
    Für erledigte Threads dürft ihr den "erledigt"-Button anklicken!
    Über Dank freut sich jeder, der euch geholfen hat - ein Klick auf "Danke" kostet ja nicht mal was
    Blog: http://javaeffective.wordpress.com/

  12. #12
    Avatar von GeHo
    GeHo GeHo ist offline Mitglied Gold
    Registriert seit
    May 2004
    Beiträge
    133
    tztz da war einer schneller =)
    Aber ich wollt noch erwähnen, dass mit eingeschalteten -wall (in dev-cpp unter Werkzeug > Compiler Optionen > Reiter Compiler > [textbox] beim Compiler-Aufruf hinzufügen > dort '-wall' rein) unter anderen auch auf die Fehlerfate Zeile hingewiesen wird.
     

Ähnliche Themen

  1. Antworten: 26
    Letzter Beitrag: 26.03.12, 17:55
  2. Einlesen einer Textdatei in einen Array
    Von Morphinus21 im Forum Java
    Antworten: 28
    Letzter Beitrag: 03.12.07, 15:00
  3. Nur ein teil einer Textdatei einlesen.
    Von solae im Forum Visual Basic 6.0
    Antworten: 13
    Letzter Beitrag: 09.04.07, 22:32
  4. Antworten: 2
    Letzter Beitrag: 07.10.04, 23:43
  5. ANSI C: Inhalt einer Textdatei löschen?
    Von Tensi im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 11.05.03, 18:34