fopen (segmentation fault)
-
Hallo,
ich möchte mit folgendem Source einen Verzeichnisbaum durchgehen
#include <stdio.h> #include <string.h> #include <dirent.h> #include <assert.h> void oFile(char fname[]){ FILE *f= NULL; f= fopen ( fname, "rb"); printf("OPEN:(%s)\n", fname); assert (f); fclose( f ); } void rDirectory( char currentDir[]){ DIR *dirpointer; DIR *dirpointerTMP; struct dirent *direntry; chdir ( currentDir ); dirpointer= opendir ( "./" ); if ( dirpointer != NULL) { direntry= readdir (dirpointer); while ( direntry ) { if ( ( strcmp ( direntry->d_name, "." ) !=0 ) && ( strcmp ( direntry->d_name, ".." ) !=0 ) ) { dirpointerTMP= opendir ( direntry->d_name ); if ( dirpointerTMP != NULL) { rDirectory ( direntry->d_name ); chdir(".."); } else { oFile ( direntry->d_name ); } } direntry = readdir (dirpointer); } } } int main(int argc, char *argv[]) { rDirectory("TESTDIRECTORY"); return 0; }
Das funktioniert (auch für sehr große Verzeichnisse optimal (bisher).
NUN möchte ich die gefundenen Dateien "binär bearbeiten".
Dazu muß ich die Zeile:f= fopen ( fname, "rb");
in folgende Zeile umwandeln:
f= fopen ( fname, "ab+");
Nur dadurch erhalte ich einen reproduzierbaren SegFault.
Mein Testverzeichnis hat 4200 Dateien und 3800 Unterverzeichnisse (auf einer Ebene; also nicht ineinander verschachtelt).
PS: Bei allen file modes passiert dieser Fehler, außer bei "r" und "rb".Könnte mir bitte jemand erklären, was "mein" Fehler hierbei ist?
lg Peter
-
Wo liegt denn der Unterschied zwischen den Modi "rb" und "ab+"?
Ja, richtig. Der eine Modus verlangt Schreibrechte auf der Datei.
Es ist häufig sinnvoll, die Dokumentation zu den verwendeten Funktionen zu lesen, bevor man sie einsetzt und lange rumsucht.
Der Seg.fault rührt wohl von fclose(f) her, wo intern versucht wird, einen Nullzeiger zu dereferenzieren. Allerdings müsste das Programm eigentlich zuvor bei assert aussteigen (bei gesetztem NDEBUG, also im "Debug"-Modus).
Sinnvoll bei fopen-Fehlern ist meistens die Verwendung von perror, bei dir also einfachperror(fname);
das liefert sprechende Fehlermeldungen.