我有一个文件,我在一个 init 函数中用 fopen 打开,我没有关闭就离开了,因为我想在另一个函数中 fread() 它。为了做到这一点,我会声明一个所有函数都可以与之交互的全局静态文件吗?
问问题
5270 次
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 回答