2016-07-25 12 views
-2

Ich recherchiere über Eingabe/Ausgabe-Datei.Below Code beziehen sich auf einige Funktionen wie: fgetc(), fgets(), fputs(). Ich weiß nicht, warum es nicht genau so funktioniert, wie ich es will. Vielen Dank! Unten ist mein Code:Warum der Eingang "abc !!!" aber die Ausgabe ist nicht "abC+++"?

#include <stdio.h> 
int main() 
{ 
    FILE *fp; //FILE type pointer 
    int c; //using to get each character from file 
    char buffer [256]; //array as buffer to archive string 

    fp = fopen("file.txt", "r"); /*open a file with only read mode*/ 
    if(fp == NULL) 
    { 
     perror("Error in opening file"); 
     return(-1); 
    } 
    while(!feof(fp)) /*check if has not yet reached to end of file*/ 
    { 
     c = getc (fp); //get a character from fp   
     if(c == '!') 
     { 
     ungetc ('+', fp); //replace '!' by '+' 

     } 
     else 
     { 
     ungetc(c, fp); //no change 
     } 
     fgets(buffer,255,fp);//push string of fp to buffer 
     fputs(buffer, stdout); //outputting string from buffer to stdout 
    } 
    return(0); 
} 

+0

Für Tipps, wie man eine Leseschleife macht siehe http://stackoverflow.com/questions/5431941/why-is-which-feof-file-always-wrong –

Antwort

-1

Vielleicht, weil Sie nur schreib Datei sind zu öffnen: durch eine andere Antwort als wies darauf hin, passiert

fp = fopen("file.txt", "r"); /*open a file with only read mode*/ 
+0

ich änderte zu "r +" aber Ergebnis nicht ändern. Ich benutze Eclipse in Windows –

+0

Diese Antwort ist einfach falsch. Siehe monkeyStrix Antwort für eine Erklärung warum. 'unggetc' versucht nicht, die Datei zu ändern. –

0

Der Fehler, weil Sie der einzige Test Zuerst char in der Datei, und dann 255 Bytes davon lesen, anstatt ein Byte nach dem anderen zu ergreifen und es zu testen.

Auch eine wichtige Sache zu beachten ist, dass ungetc nur den Strom betrifft und nicht die Datei:

Hinweis aber, dass dies nur weitere Eingabeoperationen auf diesem Strom, und nicht den Inhalt der physische Datei, , die nicht durch Aufrufe dieser Funktion geändert wird. (cplusplus.com)

Auch die Funktion, wenn nur für eine aufeinander folgende Anwendung garantiert:

zurückgeschobenen Zeichen werden in umgekehrter Reihenfolge zurückgegeben werden; Nur ein Pushback ist garantiert. (linux manual)

+0

Vielen Dank! Ich kenne diese Datei nicht ändern, nur Stream nur ändern. Aber warum läuft mein Code nicht? und gibt es ein Problem, wenn ich ungetc() verwende? –

+0

können Sie meinen Code neu schreiben, aber immer noch ungetc() -Funktion verwenden? danken. –

+0

danke! ich ersetzte fgets (buffer, 2, fp); und fputs (Puffer, stdout); zu printf ("% c", fgetc (fp)); und das Ergebnis ist wahr –

2

Die Logik in der While-Schleife ist fehlerhaft.

Dies ist, was passiert:

Sie getc das erste Zeichen, a.

a ist kein ! so Sie ungetca wieder auf dem Strom.

Dann lesen Sie eine ganze Zeile. Natürlich bekommst du abc!!!.

Anschließend drucken Sie die Zeile. Ausgabe: abc!!!.

Wenn Sie die Zeichenfolge manipulieren wollen, dass es besser ist, den Puffer zu manipulieren, anstatt zu versuchen, um den Strom zu ändern:

int i; 
    int len = fgets(buffer,255,fp);//push string of fp to buffer 
    for (i=0; i < len; i++) { 
     if (buffer[i] == '!') { 
      buffer[i] = '+'; 
     } 
    } 
    fputs(buffer, stdout); //outputting string from buffer to stdout 

Als Alternative, wenn Sie wirklich ungetc verwenden möchten, müssen Sie lesen/drucke ein Zeichen nach dem anderen, weil ungetc nur auf einem Zeichen sicher ausgeführt werden kann. Halten Sie die if und die ungetc und ersetzen Sie die fgets/fputs mit den folgenden:

fgets(buffer,1,fp);  // Read one character. 
    printf("%c", buffer[0]); // output one character from buffer to stdout 
+0

vielen Dank! aber ich möchte ungetc() -Funktion verwenden. Haben Sie einen anderen Weg, der immer noch die Funktion ungetc() verwendet? –

+0

@ThuanTran Wie monkeyStix darauf hinweist, kann man nur einen Charakter sicher "unschecken". Sie müssen also immer nur ein Zeichen lesen und drucken, wenn Sie "ungetc" verwenden möchten. Se fügte Alternative in meiner Antwort hinzu. –

+1

danke! ich ersetzte fgets (buffer, 2, fp); und fputs (Puffer, stdout); zu printf ("% c", fgetc (fp)); und das Ergebnis ist wahr –

0

Sie steuern nur das erste Zeichen der Datei und zu steuern, dass, wenn es ! ist oder nicht, dann Sie 255 Bytes aus diesem Strom gelesen und spülen Sie es zu Ausgabestrom.

Für Eingabedatei (die in Ihrem Beispiel abc!!! ist) nach dem Lesen von 255 Bytes aus dieser Datei make feof() gibt True und brechen Sie Ihre Schleife, weil es nichts zu lesen gibt.