2012-11-21 7 views
7

私は単純なCプログラムを使ってファイルを開き、そこからデータを読み込みます。コンパイルエラーはありませんが、特定のファイルでプログラムを実行すると、「セグメンテーションフォルト:コードがダンプされました」というエラーが表示されます。私は自分のコードの一番上にprintステートメントを挿入し、実行されません。まだ何もしていないときにセグメント違反を取得することは可能ですか?コードの最初の行の前のセグメンテーションフォールト

#include <stdio.h> 


int main(int argc, char **argv) 
{ 
    printf("%s", "Made it to here!"); 
FILE *fp; 
char input[100]; 
fp = fopen(argv[1], "r+b"); 
fgets(input, sizeof(input), fp); 
printf("%s", input); 
fclose(fp); 
return(0); 

} 

これはテキストバージョンで実行すると動作し、最初の行が出力されます。しかし、別のファイルtexttest.vmfで実行すると、セグメンテーションフォルトが発生し、最初のプリントは実行されません。 VMFはバルブマップファイルですが、標準的なテキスト形式です。このファイルのサイズは約3.7 KBです。何か案は?

+1

以下の回答に従ってください。ほとんどの場合、fopenの返品をチェックしてエラーがないかどうか確認していない可能性があります。 –

答えて

17

は、あなたのコードがprintf前に失敗している必要はない。printfへの呼び出しが成功しているかもしれませんが、コンソールに出力がバッファリングであるため、出力が画面に書き込まれた前に、プログラムがクラッシュしている可能性があります。

\nを出力文字列に追加すると、コンソールバッファがフラッシュされます。 printfでデバッグする場合は、書式文字列の最後に常に\nを追加する必要があります。

1

fopenコールが失敗する可能性があります。あなたがfpを使用しようとする前に、戻り値をチェックしてみてください。

FILE *fp; 
char input[100]; 
if((fp = fopen(argv[1], "r+b") == NULL) { 
    fprintf(stderr, "ERROR: Cannot open file.\n"); 
    return 1; 
} 

NULLマクロを使用するため#include <stdlib.h>を追加してください。

関連する問題