2016-07-26 3 views
1

同じプログラムで "wor.txt"というファイルを作成し、書き込みストリームを閉じました。しかし、私は最初の実行(私はファイルを作成)でそれをアクセスしようとすると、セグメンテーションフォールトを与えるが、私はこのプログラムを再実行すると正常に実行されます。fgetc()セグメンテーションフォールトを作成する

自動的に生成されたファイルを削除してプログラムを再度実行すると、セグメンテーションフォールトが発生し、2回目に(ファイルを削除せずに)実行が再開されます。

注:テキストファイル内のデータは、それが空ではないので、あります(私は、ファイルマネージャでの最初の実行後にそれを見てきました)

FILE *fp1= fopen("wor.txt","r"); 

FILE *f1= fopen("wordsa.txt","ab+"); 

if((f1==NULL)||(f2==NULL)){ 
printf("f1 or f2 is null"); 
} 

char c='0'; 
while((c)!=EOF){ 
printf("Here is one marker\n"); 
    c=fgetc(fp1); //This Line gives error 
printf("Here is another marker\n"); 
    fputc(c,f1); 
}  
+2

'f1 == NULL' - >' fp1 == NULL'です。あなたのコードが適切にフォーマットされていれば、あなた自身がこれを見ているでしょう。また、一貫した命名規則を使うべきです:両方の変数 'f1'と' f2'または 'fp1'と' fp2'を呼び出します。 –

+1

'fp1 == NULL'を検出した後(少なくともあなたのコードで' f2'をチェックすると仮定します)、とにかく続行します –

答えて

2

charはにタイプを変更し、EOFには十分ではありませんint

fgetc()を確認すると、intが返されます。戻り値の格納には同じデータ型を使用し、さらに使用する必要があります。

つまり、f1またはfp1のいずれかがNULLの場合、引き続きUBを作成する可能性のあるファイルポインタにアクセスしています。ポインタにアクセスするコードに到達しないように、NULLチェックとreturnまたはexitのどちらかを理解する必要があります。

0

誤った確認。

ストリームのオープンを正しく検出するには、f2ではなく、fp1をチェックします。そして、ファイルがseg faultよりも適切に開かないと、コードは正常に失敗します。

FILE *fp1= fopen("wor.txt","r"); 
FILE *f1= fopen("wordsa.txt","ab+"); 

// if((f1==NULL)||(f2==NULL)){ 
if((f1==NULL) || (fp1==NULL)){ 

    printf("f1 or fp1 is null"); 
} 

また、典型的には256の+ 1の異なる値(unsigned char値とEOF)を返し、charが一意に区別するためには不十分であるint cfgetc()として使用します。

関連する問題