2

我有一个文件,我在一个 init 函数中用 fopen 打开,我没有关闭就离开了,因为我想在另一个函数中 fread() 它。为了做到这一点,我会声明一个所有函数都可以与之交互的全局静态文件吗?

4

3 回答 3

2

不; 您可以将文件指针作为参数传递给函数。

例如:

FILE *init( char *fname )
{
  FILE *fp = fopen( fname, "r" );
  return fp;
}

void read( FILE *fp )
{
  ...
  while ( fread( buffer, sizeof buffer, 1, fp ))
    // do stuff
}

int main( void )
{
  FILE *fp = NULL;
  ...
  fp = init( "myfile.txt" );
  if ( fp )
    read( fp );
  ...
}

理想情况下,函数应该通过参数、返回值和异常(如果可用)进行通信;通过全局变量共享状态会导致维护问题。

于 2013-06-14T02:56:09.657 回答
1

通过翻译单元范围的变量(即 a static FILE *)传递文件是可以接受的。但是,对于谁负责调用 ,它留下了一些疑问fclose。更好的方法是让打开文件的函数返回FILE*给调用者,假设调用者稍后会调用fclose.

更好的是,让调用的函数fread也执行fopen: 而不是打开文件,第一个函数可以准备文件名,并将其存储在static变量中。然后读取函数可以在一个函数中调用fopen、执行fread和调用全部。fclose

于 2013-06-14T02:52:08.893 回答
1

这取决于您需要返回的FILE*范围fopen()。如果您在 中打开文件main(),您可以继续将文件指针作为输入参数传递给其他函数。就像是:

int main ( void )
{
    FILE *pFile = fopen ( ... );

    // validate pFile

    SomeFunc ( pFile );

    ...

    fclose ( pFile );
}

void SomeFunc ( FILE *pF )
{
    ...

    fread ( ... );

    ...
}

除非您出于某种原因确实需要它,否则我不会将文件指针声明为全局变量 - 很容易忘记正确清理全局变量,并且在较大的程序中很难看到变量的生命周期。

最好的方法是保持文件的范围尽可能小——这使得阅读/维护代码变得容易,并更快地释放资源。

于 2013-06-14T02:55:02.237 回答