2016-07-21 13 views
-2

Wenn ich versuche, fopen() in C aufzurufen, erhalte ich den Segmentierungsfehler nur bei Aufrufen mit einer Datei im Verzeichnis. Ich arbeite an einem Projekt, das einen Fingerabdrucksensor verwendet, den Fingerabdruck in einer Datei registriert und dann die Datei liest, um sie mit einem Fingerabdruck zu vergleichen, der zur Laufzeit gelesen wird.fopen() verursacht Segmentierungsfehler beim Aufruf einer vorhandenen Datei

Hier ist der Kern des Codes.

FILE * file; 
// right_thumb.bin is located in the same directory as the file. 
// right_thumb.bin is created using fwrite. 
file = fopen("right_thumb.bin", "rb"); 
// program crashes right at the line above, with the segmentation fault error. 
ABS_BIR * readImage; 
fread(&readImage, sizeof(ABS_BIR), sizeof(&var), file); 
// &var is a pointer to the fingerprint that was written 
// ABS_BIR is the fingerprint data type 
fclose(file); 

Das Merkwürdige ist, dass die folgenden funktioniert perfekt ...

File * file; 
file = fopen("right_thumb.bin", "w"); 
fwrite(&var, sizeof(ABS_BIR)/*size of the type the fingerprint is stored in*/ 
, sizeof(&var)/*8*/, file); 
fclose(file); 
file = fopen("right_thumb.bin", "rb"); 
fread(&readImage, sizeof(ABS_BIR), sizeof(&var), file); 

was seltsam ist, ist, dass ich frei die gleiche Datei erstellt öffnen kann, aber wenn ich ändern, um die Datei in einem anderen Datei, die von einer älteren Instanz dieser Datei erstellt wurde, erhalte ich den Fehler.

+5

Sie rufen undefiniertes Verhalten an anderer Stelle in Ihrem Code auf. Führen Sie es unter [valgrind] (http://valgrind.org) aus, damit Sie herausfinden können, wo. – dbush

+0

Wenn es bei einem Standard-Aufruf von 'fopen()' abstürzt, haben Sie wahrscheinlich den Stapel vor dem Aufruf beschädigt. – Olipro

+0

Warum bist du dir so sicher, dass das 'fopen'call Programm abstürzt? Sie möchten Ihren Code mit einem Debugger ausführen, um die Zeile genau zu bestimmen, in der das Programm abstürzt. – alk

Antwort

4

es scheint, dass Sie Schwierigkeiten haben, das Verständnis freadfwrite Nutzung und Zeigervariable, und es hat sehr wenig mit Ihrem fopen Anruf zu tun

  • fread keinen Puffer für Sie zuweisen, müssen Sie es zuweisen
  • readImage ist bereits einen Zeiger (nicht zugeordneten), wenn Sie es als ein Argument an fread verwenden, so dass ihr Wert etwas,
    könnte Addditionally Sie vorbei &readImage was bedeutet, dass Sie an die Adresse des Zeigers schreiben werden. das könnte gelten, aber ich bezweifle, dass das deine Absicht war.
  • sizeof Rückkehr der Größe der Variable, die Sie als Argument übergeben, zum Beispiel in Ihrem Fall: sizeof(&var) gibt die Größe der Adresse var (die offenbar 8 auf Ihrem System ist)

Ich würde Sie empfehlen Verwenden Sie einen Debugger, der Ihnen einen Einblick in die Vorgänge in Ihrem Code bietet.

Meine Vermutung ist, dass Sie die folgende schreiben sollte:

File * file; 
file = fopen("right_thumb.bin", "w"); 
fwrite(var, sizeof(ABS_BIR)/*size of the type the fingerprint is stored in*/ 
, 1/* corrected, only one buffer of ABS_BIR size to write*/, file); 
fclose(file); 

file = fopen("right_thumb.bin", "rb"); 
ABS_BIR * readImage=malloc(sizeof(ABS_BIR)); 
fread(readImage, sizeof(ABS_BIR), 1, file); 

Beachten Sie, dass ich Ihre Instanz von sizeof(&var)-1 geändert, wie Sie lesen und schreiben einen Puffer der Größe sizeof(ABS_BIR) an/aus dieser Datei

Verwandte Themen