fopen和fclose,跨函数传递文件
我有一个在init函数中用fopen打开的文件,我没有关闭它,因为我想在另一个函数中对它进行fread()处理。为了做到这一点,我将声明一个所有函数都可以与之交互的全局静态文件?通过转换单元作用域变量传递文件(即fopen和fclose,跨函数传递文件,c,fopen,fread,fclose,C,Fopen,Fread,Fclose,我有一个在init函数中用fopen打开的文件,我没有关闭它,因为我想在另一个函数中对它进行fread()处理。为了做到这一点,我将声明一个所有函数都可以与之交互的全局静态文件?通过转换单元作用域变量传递文件(即静态文件*)是可以接受的。然而,对于谁负责调用fclose,它留下了一些疑问。更好的方法是使用打开文件的函数将文件*返回给调用者,假设调用者稍后会调用fclose 更好的是,让调用fread的函数也执行fopen:第一个函数可以准备文件名,并将其存储在静态变量中,而不是打开文件。然后,读
静态文件*
)是可以接受的。然而,对于谁负责调用fclose
,它留下了一些疑问。更好的方法是使用打开文件的函数将文件*
返回给调用者,假设调用者稍后会调用fclose
更好的是,让调用
fread
的函数也执行fopen
:第一个函数可以准备文件名,并将其存储在静态变量中,而不是打开文件。然后,读取函数可以在单个函数中调用fopen
、dofread
s和调用fclose
。通过翻译单元范围的变量传递文件(即静态文件*
)是可以接受的。然而,对于谁负责调用fclose
,它留下了一些疑问。更好的方法是使用打开文件的函数将文件*
返回给调用者,假设调用者稍后会调用fclose
更好的是,让调用fread
的函数也执行fopen
:第一个函数可以准备文件名,并将其存储在静态变量中,而不是打开文件。然后,读取函数可以在单个函数中调用fopen
、dofread
s和调用fclose
。这取决于fopen()
返回的文件*
的范围。如果在main()
中打开该文件,则可以继续将文件指针作为输入参数传递给其他函数。比如:
int main ( void )
{
FILE *pFile = fopen ( ... );
// validate pFile
SomeFunc ( pFile );
...
fclose ( pFile );
}
void SomeFunc ( FILE *pF )
{
...
fread ( ... );
...
}
除非您出于某种原因确实需要它,否则我不会将文件指针声明为全局变量——很容易忘记正确清理全局变量,在大型程序中很难看到变量的生命周期
最好的方法是尽可能地缩小文件的范围-这使得读取/维护代码变得容易,并更快地释放资源。这取决于fopen()
返回的文件*
的范围。如果在main()
中打开该文件,则可以继续将文件指针作为输入参数传递给其他函数。比如:
int main ( void )
{
FILE *pFile = fopen ( ... );
// validate pFile
SomeFunc ( pFile );
...
fclose ( pFile );
}
void SomeFunc ( FILE *pF )
{
...
fread ( ... );
...
}
除非您出于某种原因确实需要它,否则我不会将文件指针声明为全局变量——很容易忘记正确清理全局变量,在大型程序中很难看到变量的生命周期
最好的方法是尽可能地缩小文件的范围,这样可以更容易地读取/维护代码并更快地释放资源。No;您可以将文件指针作为参数传递给函数
例如:
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 );
...
}
理想情况下,函数应该通过参数、返回值和异常(如果可用)进行通信;通过全局变量共享状态会导致维护问题 No;您可以将文件指针作为参数传递给函数
例如:
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 );
...
}
理想情况下,函数应该通过参数、返回值和异常(如果可用)进行通信;通过全局变量共享状态会导致维护问题