我有一个文件,我在初始化函数中使用fopen打开而不关闭,因为我想在另一个函数中fread()它。为了做到这一点,我会声明一个所有函数都可以与之交互的全局静态文件吗?
答案 0 :(得分: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 );
...
}
理想情况下,函数应通过参数,返回值和异常(如果可用)进行通信;通过全局变量共享状态会导致维护问题。
答案 1 :(得分:1)
通过翻译单元传递文件 - 范围变量(即static FILE *
)是可以接受的。但是,对谁负责调用fclose
会有一些疑问。更好的方法是让函数打开文件返回FILE*
给调用者,假设调用者稍后会调用fclose
。
更好的是,让调用fread
的函数也执行fopen
:第一个函数可以准备文件名,并将其存储在static
中,而不是打开文件。变量。然后,阅读功能可以调用fopen
,执行fread
,并在一个函数中调用fclose
。
答案 2 :(得分:1)
这取决于FILE*
返回fopen()
所需的范围。如果在main()
中打开文件,则可以继续将文件指针作为输入参数传递给其他函数。类似的东西:
int main ( void )
{
FILE *pFile = fopen ( ... );
// validate pFile
SomeFunc ( pFile );
...
fclose ( pFile );
}
void SomeFunc ( FILE *pF )
{
...
fread ( ... );
...
}
除非你出于某些原因真的需要它,否则我不会将文件指针声明为全局变量 - 很容易忘记正确地清理全局变量,而在较大的程序中很难看到变量的生命周期。 / p>
最好的方法是尽可能地保持文件的范围 - 这样可以更容易地阅读/维护代码并更快地发布资源。