12

私はCで簡単なファイル処理を試みてきましたが、これを使用してファイルにアクセスできることを確認したかったのです

#include<stdio.h>

main()
{
    CheckFile();
}

int CheckFile()
{
    int checkfile=0;

    FILE *fp1;
    fp1 = fopen("users.sav","r");

    if(fp1==NULL)
    {
        fopen("users.sav","w");
        fclose(fp1);
    }   
    if(checkfile!=0)printf("\nERROR ACCESSING FILE!\nNow exiting program with exit code: %d\n",checkfile);exit(1);
    return 0;
}

その後、表示されます

Segmentation fault (core dumped)

ただし、ファイルが事前に存在する場合 (たとえば、手動で作成したとき、またはプログラムを 2 回目に実行したとき)、セグメンテーション違反は発生しません。

助けてください。1 週間後に予定されている最終プロジェクトでこれが必要ですが、まだファイルとポインタのコツをつかんでいません。

「gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1」を使用しています

Ps

これは別の質問で見ました

元のコードでは、fopen が実際に機能しているという保証はありません。その場合、NULL が返され、fclose の動作が定義されません。

では、それが機能したかどうかを正確に確認するにはどうすればよいですか?

4

5 に答える 5

2

何をしようとしているのかよくわかりませんが、差し迫った問題は次のとおりです。

if(fp1==NULL)
   fclose(fp1);

fp1 が NULL であることをアサートした後、ヌル ポインターを呼び出そうとしているcloseため、セグメンテーション フォールトが発生します。

ファイルが存在することを確認するだけの場合は、ファイルが C に存在するかどうかを確認する最良の方法は何ですか? (クロスプラットフォーム)

于 2014-03-19T13:03:11.627 に答える
0

のmanページには次のように書かれfcloseています-

ストリーム パラメータが無効なポインタである場合、または fclose() の以前の呼び出しにすでに渡された記述子である場合、fclose() の動作は未定義です。

エラーはifコードのブロックにあります。

if(fp1==NULL)
{
    fopen("users.sav","w");
    fclose(fp1);  // passing NULL to fclose invokes undefined behaviour
}   
于 2014-03-19T13:02:59.843 に答える
0

別の無関係な問題:

この行はおそらくあなたが望むものではありません:

if(checkfile!=0)printf("\nERROR ACCESSING FILE!\nNow exiting program with exit code: %d\n",checkfile);exit(1);

正しくフォーマットして書くと、エラーが明らかになります:

if (checkfile != 0)
  printf("\nERROR ACCESSING FILE!\nNow exiting program with exit code: %d\n",checkfile);

exit(1);
return 0 ;

実際にはがゼロのexit(1)場合でも到達します。checkfile

おそらくこれが必要です:

if (checkfile != 0)
{
  printf("\nERROR ACCESSING FILE!\nNow exiting program with exit code: %d\n",checkfile);
  exit(1); 
}

return 0 ;

結論: コードを正しくフォーマットすると、多くのエラーが突然明らかになります。

于 2014-03-19T13:09:41.723 に答える