2016-03-27 20 views
1

der folgende code, den ich schrieb, soll eine datei öffnen, die als ein eingang gegeben wird, schreibe es und den gelesenen.c - seltsame fgets() verhalten

  • fopen() funktioniert einwandfrei und ich habe Zugriff auf die Datei.
  • fprintf() funktioniert auch wie erwartet.

aber betreffs fgets -Wenn Ich verwende den Befehl, wenn wie dargestellt die Bedingung wahr ist, und wenn i i nicht bekommen, dass die Eingabe [0] der ‚\ n‘ Charakter während des Eingang [1] ' h ', und die Schleife läuft ohne anzuhalten, da fgets() das erste Zeichen immer wieder liest.

auch, es scheint, wie fgets() nicht weiter und hat alle die Datei in Eingabe gelesen - ich kann Eingabe [3] und bekomme 'l' wie erwartet, obwohl fgets() bestellt, nur 2 zu lesen Zeichen.

int main(int argc, char *argv[]) 
{ 
    FILE* read = NULL; 
    read = fopen(name, "a+"); 

    char* input = ""; 

    fprintf(read, "hello world\n"); 
    fprintf(read, "hello world\n"); 

    assert(ferror(read) == 0); 

    while(!feof(read)) 
    { 
     if(fgets(input, 2, read)==NULL) 
      return 0; 
     printf("%c\n", input[1]); 


    } 
return 0; 
} 
+4

'char * Eingabe =" ";'. Das bedeutet, dass "input" auf ein String-Literal verweist. String-Literale können nicht geändert werden. Ihr Programm hat also ein nicht definiertes Verhalten. Sie müssen einen Speicherpuffer für 'input' reservieren. Außerdem müssen Sie nach dem 'fprintf' den Dateizeiger zurückspulen, wenn Sie das, was Sie gerade geschrieben haben, zurücklesen wollen. Und schließlich, siehe [Warum ist "während (! Feof (Datei))" immer falsch?] (Http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong). – kaylum

Antwort

1

printf("%c\n", input[1]); Will Allways nul char

Man Seiten Ihre Freunde sind drucken.

fgets() liest in höchstens eine weniger als Größe Zeichen aus dem Strom und speichert sie in den Puffer zu spitz durch s. Das Lesen stoppt nach einem EOF oder einem Zeilenumbruch. Wenn eine neue Zeile gelesen wird, wird sie im Puffer gespeichert. Ein abschließendes Nullbyte (aq \ 0aq) wird nach dem letzten Zeichen im Puffer gespeichert.

1
char* input = ""; 

Dies macht input Punkt auf eine String-Konstante, nämlich eine leere Zeichenfolge.

if(fgets(input, 2, read)==NULL) 

Dies versucht zu ändern, was input verweist auf. Da input auf eine String-Konstante zeigt, wird versucht, eine String-Konstante zu ändern. Aber per Definition können Sie eine Konstante nicht ändern - das macht sie konstant.