2017-02-24 4 views
1

So eine Datei Ich öffne, lässt diese Datei aufrufen key.txtGibibberish in eine Datei schreiben?

FILE *fp; 
    fp = fopen("key.txt", "r"); 

Jetzt können sagen, ich habe eine andere Datei (fa), die ich mit dem Code „a“ geöffnet, um es anzuhängen. Nun lese ich alle Zeichen aus fp und füge jedes alphabetische Zeichen an die Datei fp an, aber es fügt MORE hinzu.

char c; 
    do { 
     c = getc(fp); 
     if(isalpha(c)){ 
      fprintf(fa, &c); 
      fprintf(fa, "\n"); 
     } 
    } while(c != EOF); 

Ok, so das für mich gut aussieht, jetzt ist es jedes alphabetische Zeichen in die Datei hinzufügen, aber das Problem ist, es ist sogar MEHR Zeichen auf eine einzige Textzeile hinzugefügt. Ich versuche dieses Problem genau zu bestimmen. Hier ist ein Beispiel, innerhalb key.txt wir

lol 
    xd 

Die Ausgabedatei fa haben hat den Inhalt

l<82>^0)y^? 
    o<82>^0)y^? 
    l<82>^0)y^? 
    x<82>^0)y^? 
    d<82>^0)y^? 

So im nicht bekommen, was hier vor sich geht. Wie behebe ich das? Ich bin nicht sicher, was das genaue Problem ist

+5

'fprintf (fa, &c);' -> 'fprintf (fa "% c", c);' –

+0

@SouravGhosh, die danken gearbeitet? du! Craig Estey, ich habe mit -Wall kompiliert und es hat prima funktioniert – reVolutionary

+0

Ja, es kompiliert [ich habe es nach nochmaligem Hinsehen nochmal überprüft], weshalb ich meinen ersten Kommentar gelöscht habe. Die '& c' [technisch gesprochen] würde sei ein 'char *' und würde vom Formatscanner im Compiler akzeptiert werden, ohne daraus abzuleiten, dass es nicht das Äquivalent von 'char fmt [2]' war, und es beim Aufruf von 'fp mit –

Antwort

5

Sie verwenden fprintf() falsch. Vom man page, das erwartete Format

int fprintf(FILE *stream, const char *format, ...); 

wo das erste Argument den Dateizeiger ist, die zweite die Konvertierungsspezifizierer und dritte vorwärts ist (sind) das Argument (e) an den Konvertierungsspezifizierer erwähnt .

C11 Zitiert, Kapitel §7.21.6.1, fprintf(), für das Format-Spezifizierer

c

Wenn kein l Längenmodifizierer vorhanden ist, die int Argument auf ein unsigned char umgewandelt wird, und das das resultierende Zeichen wird geschrieben. [...]

Also, falls Sie ein Zeichen schreiben möchten, müssen Sie so etwas wie

fprintf(fa, "%c", c); //%c for character, no '&' needed before variable 

Das heißt verwenden, getc() gibt ein int so sollten Sie den Rückgabewert erfassen in einer int Variable.

Moral der Geschichte: Compiler Warnungen aktivieren.

1

Ihr Codefragment hat mehrere Probleme:

char c; 
do { 
    c = getc(fp); 
    if(isalpha(c)){ 
     fprintf(fa, &c); 
     fprintf(fa, "\n"); 
    } 
} while(c != EOF); 
  • c sollte mit dem int Typ deklariert werden für alle Werte des Typs aufnehmen unsigned char, sowie dem speziellen negativen Wert EOF.

  • fprintf muss eine Formatzeichenfolge übergeben werden. fprintf(fa, &c); hat undefiniertes Verhalten.Verwenden Sie fprintf(fa, "%c", c); oder einfach putc(c, fa);. undefinierten Verhalten bedeutet alles passieren kann: Kauderwelsch Ausgang ist eine Möglichkeit, ein Programmabsturz ein anderer ist ...

  • Check für EOF vor der weiteren Verarbeitung in der Schleife. Die do { ... } while Schleife ist nicht geeignet, verwenden Sie stattdessen while ((c = getc(fp)) != EOF) { ... }.

Hier ist eine korrigierte Version:

int c; 
while ((c = getc(fp)) != EOF) { 
    if (isalpha(c)) { 
     fprintf(fa, "%c\n", c); 
    } 
}