2016-07-21 4 views
-2

Cでfopen()を呼び出そうとすると、ディレクトリ内のファイルを持つ呼び出しでのみセグメント化エラーが発生します。私は指紋センサーを使用し、ファイルに指紋を登録し、実行時に読み取られている指紋と比較するためにファイルを読み取るプロジェクトに取り組んでいます。既存のファイルで呼び出されたときにfopen()がセグメンテーション違反を起こす

コードの要点は次のとおりです。

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); 

奇妙なことは、どのような奇妙ですが、私は自由に作成し、同じファイルを開くことができますが、私は別のにファイルを変更した場合ということです...次は完璧に動作することを、

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); 

ですこのファイルの古いインスタンスによって作成されたファイルでは、エラーが発生します。

+5

にサイズsizeof(ABS_BIR)の一つのバッファを読んで書いているように私は1sizeof(&var)のインスタンスを変更

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); 

注意コード内のどこかで未定義のビヘイビアを呼び出しています。それを[valgrind](http://valgrind.org)の下で実行すると、どこにあるかを知ることができます。 – dbush

+0

標準の 'fopen()'呼び出しでクラッシュすると、スタックを呼び出す前にスタックが破損している可能性があります。 – Olipro

+0

「fopen」コールがあなたのプログラムをクラッシュさせているのはなぜなのですか?デバッガを使用してコードを実行して、プログラムがクラッシュする行を正確に特定したいとします。 – alk

答えて

4

あなたがトラブルfreadfwrite利用状況を把握し、ポインタ変数を持っているようで、それはあなたのfopenコール

  • freadとはほとんど関係がないが、あなたがそれを割り当てる必要がある、あなたのためのバッファを割り当てません
  • readImageはすでにその値は何でもかまいませんので、あなたは、freadの引数としてそれを使用しているポインタ(未割り当て)、
    Addditionallyあなたはを渡しているのですは、ポインタのアドレスに書き込むことを意味します。それは有効かもしれないが、私はそれがあなたの意図であるとは思っていない。あなたのケースでは例えば
  • sizeofリターンあなたが引数として渡す変数のサイズ、: sizeof(&var)戻ります(ご使用のシステムに明らかに8です)varへのアドレスのサイズは

私はあなたをお勧めしますデバッガを使用すると、コードで何が起こっているのかを把握することができます。

私の推測では、あなたが次のことを書くべきであるということです:あなたは/そのファイルから

関連する問題