2017-03-25 4 views
-2

Ich versuche, einen Bericht in einer TXT-Datei zu erstellen, aber wenn mein fprintf einen \n trifft, stürzt es ab. Dies ist mein Code zum Öffnen der Datei und zum Absturz:fprintf stürzt mein Programm ab, wenn es n trifft

+3

Sie können den Wert von 'f' nicht überprüfen, zum Beispiel' if (f == NULL) {exit (1); } ' –

+2

Das ist kein komplettes Programm. Bitte zeigen Sie uns einen [mcve]. –

+0

funktioniert für mich auf Windows, auch wenn die Datei nicht erstellt werden kann. Hast du es mit einem Debugger versucht –

Antwort

3

Das Problem ist, dass Sie nicht überprüft haben, ob die Datei geöffnet ist. Wenn es fehlschlägt, gibt es NULL zurück und das wird schlechte Dinge an fprintf machen.

Ihre erste fprintf(f, ""); ist ein No-Op. Drucken einer leeren Zeichenfolge tut nichts, so dass "funktioniert" (obwohl ich bezweifle, dass das garantiert ist). printf("3"); funktioniert stdout und ist nicht betroffen von der fehlgeschlagenen fopen. fprintf(f, "TEXT TO INPUT\n") schließlich versucht, auf NULL und kotzen zu drucken.

Alle Systemaufrufe müssen überprüft werden. Sie haben alle unterschiedliche Rückgabewerte im Fehlerfall. fopen gibt NULL zurück und der Fehler liegt in errno. Es gibt viele Möglichkeiten, fopen Fehlerbehandlung zu tun, hier ist eine, die ich mag, die dem Benutzer Informationen gibt, um das Problem zu debuggen.

#include <string.h> // for strerror() 
#include <errno.h>  // for errno 
#include <stdio.h> 
#include <stdlib.h> 

int main(){ 
    // Put the filename in a variable so it can be used in the 
    // error message without needing to be copied. 
    char file[] = "estructuras.txt"; 

    FILE *fp = fopen(file, "w"); 
    if(fp == NULL) { 
     // Display the filename, what you were doing with it, and why it wouldn't open. 
     fprintf(stderr, "Could not open '%s' for writing: %s\n", file, strerror(errno)); 
     exit(-1); 
    } 
} 

strerror(errno) schaltet den numerischen errno Fehlercode in einen Menschen lesbaren String. Es gibt Anführungszeichen um den Dateinamen für den Fall, dass zusätzliche Leerzeichen eingefügt werden.

So erhalten Sie einen Fehler wie Could not open 'estructuras.txt': No such file or directory.

+0

ist das "Drucken auf NULL" Verhalten garantiert? weil unter Windows das Programm nicht abstürzt. Ich fand diesen Link: http://computer-programming-forum.com/47-c-language/3b3b0abba003f0d6.htm. Sounds undefiniertes Verhalten/Implementierung definiert. –

+0

@ Jean-FrançoisFabre [MSVC man page für 'fprintf'] (https://msdn.microsoft.com/en-us/library/xkh07fe2.aspx) sagt *" Wenn 'stream' oder' format' '' NULL' 'ist Diese Funktionen rufen den ungültigen Parameterhandler auf, wie in [Parameterüberprüfung] beschrieben. Wenn die Ausführung fortgesetzt werden kann, geben die Funktionen "-1" zurück und setzen "errno" auf "EINVAL". "* –

+0

@ Jean-FrançoisFabre I ' Ich gehe davon aus, dass es Undefined Behavior ist. Ein kurzer Überfliegen der C99-Spezifikationen stdio.h und fprintf sagt nichts über Nullzeiger aus. Am nächsten sehe ich: * Die Funktion fprintf gibt die Anzahl der übertragenen Zeichen zurück oder einen negativen Wert, wenn ein Ausgabe- oder Codierungsfehler aufgetreten ist *, so dass ein negativer Wert zurückgegeben werden kann, aber clang entscheidet sich für segfault. Hinweis: Diese Antwort zieht nur das beobachtete Verhalten auseinander. – Schwern

Verwandte Themen