it-swarm.com.de

Warum gibt 'fopen' einen Nullzeiger zurück?

Ich arbeite an einem einfachen File Splitter/Merger-Programm in der Programmiersprache C. Das Problem ist aus irgendeinem Grund, dass fopen NULL zurückgibt, und aus diesem Grund stürzt mein Programm bei der Anweisung fwrite ab. Wie behebe ich das?

Hier ist die C-Datei:

int SplitFile(char* filename, char* output, size_t size)
{
    char current_file_name[256];
    int file_count = 0, i = 0;
    FILE *file = fopen( filename, "rb" );
    printf("split %s into chunks of %d named\n", filename, size);

    if (!file)
       return E_BAD_SOURCE;
    else
    {
        output = (char *) malloc(size * sizeof(char));
        if (output == NULL)
            return E_NO_MEMORY;
        else
        {
            int bytes_read = 0;
            FILE *outFile;
            do
            {
                bytes_read = fread(output, sizeof(char), size, file );
                sprintf(current_file_name, "%s%04lu\n", "part", file_count++);
                outFile = fopen (current_file_name, "wb" );  // THIS RETURNS NULL
                fwrite(output, sizeof(char), bytes_read, outFile); //CRASHES ON THIS LINE
            }
            while ( bytes_read > 0 )
                ;

            //fclose(outFile);
        }
    }
    fclose(file);
    printf("...\n");
    return 0;
}
12
k787

Die richtige Sache ist zu prüfen, ob errno wenn fopenNULL zurückgibt.

Ich vermute, dass Ihr Problem darin besteht, dass Sie versuchen, in ein Dateisystem zu schreiben, in dem \n in Dateinamen nicht zulässig ist. Es könnte sich jedoch auch um ein Problem mit Berechtigungen handeln.

10
Gabe

Es gibt viele Gründe, aus denen fopenNULL zurückgeben kann, einschließlich (aber sicherlich nicht beschränkt auf):

  • Die Datei existiert nicht 
  • Die Datei wird in einem Modus geöffnet, der keine anderen Zugriffe zulässt
  • Das Netzwerk ist ausgefallen
  • Die Datei ist vorhanden, Sie haben jedoch keine Berechtigungen
  • Es ist eine Datei mit dem von Ihnen angegebenen Namen vorhanden, das aktuelle Verzeichnis des Prozesses entspricht jedoch nicht dem, was Sie erwartet haben. Daher kann der relative Pfadname die Datei nicht finden und öffnen.

Um herauszufinden, wer dafür verantwortlich ist, ist Dig in den errno-Code. 

Nur weil Sie diesen bestimmten Fehler beheben, bedeutet dies nicht, dass Sie davon ausgehen können, dass fopen niemals NULL zurückgibt. Bei E/A-Vorgängen muss Ihr Code lediglich mit einem Ausfall rechnen. Es ist nicht möglich, den Erfolg von E/A-Vorgängen vorherzusagen, und diese können immer fehlschlagen.

5
JaredPar

Dies bedeutet, dass die Datei möglicherweise nicht existiert oder ein Berechtigungsfehler beim Zugriff auf eine Datei wie "Schreibgeschützt" oder "Schreibgeschützt" aufgetreten ist. In diesen Fällen gibt fopen 0 (einen NULL-Zeiger) zurück. Bei Erfolg wird ein Dateizeiger als Handler zurückgegeben.

fp=fopen("c:\\ABC.txt", "r"); kann nicht mit fp=fopen("c:\\abc.txt", "r"); identisch sein.

Verwenden Sie // anstelle von \\ in einer Linux-Umgebung.

P.S .: In Linux- und Unix-ähnlichen Betriebssystemen lautet der Dateiname Groß-/Kleinschreibung wird berücksichtigt .

1
Sohail xIN3N

Wie Gabe sagte, ist Ihr Problem ein Newline-Dateiname, der in Windows illegal ist.

Aber warum verwenden Sie nicht einfach split aus GNU Core Utilities. Standardmäßig unter Unices/Linux installiert, kann für Windows von GnuWin32 project heruntergeladen werden.

split --suffix-length=4 --numeric-suffixes --bytes=1M - part < filename
1
Tometzky

In Unix gibt es für fopen () keinen Grund, ./ einem vor fopen () übergebenen Dateinamen vorangestellt zu werden.

0

Ist fopen for write return im ersten Durchlauf NULL?

Ich habe bemerkt, dass Sie in der Zwischenzeit offene Dateien zum Schreiben behalten, sie aber nicht schließen.

Versuchen Sie, fclose (outFile) nach fwrite hinzuzufügen:

outFile =  fopen ( current_file_name , "wb" );    
fwrite(output, sizeof( char ), bytes_read, outFile); 
fclose(outFile)

Es ist möglich, dass Sie mehr Dateien öffnen, als Ihr Betriebssystem zulässt.

0
Amir

In meinem Fall las ich dieselbe Datei in einer while-Schleife noch einmal und vergaß, sie zu schließen.

Ich habe eine Funktion zum Lesen der Datei und zum Finden einer Übereinstimmung verwendet, und die Funktion hatte eine return;-Anweisung, die die Funktion vor dem Ausführen von fclose(fp): D beendete

0
Riki137

Der Pfad, der für die Datei angegeben wird, wird von dem Ort aus geprüft, an dem die ausführbare Datei vorhanden ist. In meinem Fall habe ich die Textdatei in einer c-Datei geöffnet, wenn beide an derselben Stelle vorhanden waren. Es wurde fortlaufend der Fehler angezeigt, dass die Datei nicht gefunden wurde. Die Datei wurde im Ordner der ausführbaren Datei abgelegt, und der Vorgang wurde gestartet. 

0
Sanya Tayal