1

kk。私は人生を理解する必要があります。ファイル ポインタである fp を新しい関数に渡してそこで開くと、fclose(fp) によってセグ フォールトが発生します。そして、ファイル ポインタ fp が開かれていないことを発見しました。

main(int argc, char *argv[])
{
   File *fp;
   //*argv == filename
   functionToOpenFile(fp,*argv);
   //do stuff
   fclose(fp);
}

functionToOpenFile(File *fp, char *filename)
{
   fp = fopen(filename,"w");
   //error handling not shown
}

機能する私の解決策は、ファイルへのポインターへのポインターである fp のアドレスを渡すことです。なぜそれが物事を変えるのか理解できない

main(int argc, char *argv[])
{
   File *fp;
   //*argv == filename
   functionToOpenFile(&fp,*argv);
   //do stuff
   fclose(fp);
}

functionToOpenFile(File **fp, char *filename)
{
   *fp = fopen(filename,"w");
   //error handling not shown
}

-オースチン

4

3 に答える 3

3

ポインターをパラメーターとして送信しているため、つまりポインターがスタック上に作成されるため、関数で行った変更は関数のスコープ外では表示されません。したがって、ファイルを閉じたいときは、実際には、以前に開いていないものを閉じようとしています。

于 2011-12-01T08:00:07.220 に答える
2

渡されたポインターを変更しているのではなく、そのローカル コピーを変更しているだけです。そのため、当然、呼び出し側の関数の最後では、何もしなかったように見えますfunctionToOpenFile。これを試して:

functionToOpenFile(FILE **fp, char *filename)
{
   *fp = fopen(filename,"w");
}

/* ... */
functionToOpenFile(&fp,*argv);

この正確な問題を説明するC FAQがあります。

于 2011-12-01T07:59:38.660 に答える
0

どうですか

int main(int argc, char *argv[])
{
   FILE *fp;
   //*argv == filename
   fp = functionToOpenFile(argv[1]); // better than argv[0] aka *argv.
   if (fp) {
        //do stuff
        fclose(fp);
   } else {
       // error occurred, but has already been dealt with.
   }
}

FILE * functionToOpenFile(char *filename)
{
   FILE * fp = fopen(filename,"w");
   //error handling not shown
   return fp;
}
于 2011-12-01T08:22:35.137 に答える