fopen和fclose,跨函数传递文件

fopen和fclose,跨函数传递文件,c,fopen,fread,fclose,C,Fopen,Fread,Fclose,我有一个在init函数中用fopen打开的文件,我没有关闭它,因为我想在另一个函数中对它进行fread()处理。为了做到这一点,我将声明一个所有函数都可以与之交互的全局静态文件?通过转换单元作用域变量传递文件(即静态文件*)是可以接受的。然而,对于谁负责调用fclose,它留下了一些疑问。更好的方法是使用打开文件的函数将文件*返回给调用者,假设调用者稍后会调用fclose 更好的是,让调用fread的函数也执行fopen:第一个函数可以准备文件名,并将其存储在静态变量中,而不是打开文件。然后,读

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

通过转换单元作用域变量传递文件(即
静态文件*
)是可以接受的。然而,对于谁负责调用
fclose
,它留下了一些疑问。更好的方法是使用打开文件的函数将
文件*
返回给调用者,假设调用者稍后会调用
fclose


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

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


更好的是,让调用
fread
的函数也执行
fopen
:第一个函数可以准备文件名,并将其存储在
静态变量中,而不是打开文件。然后,读取函数可以在单个函数中调用
fopen
、do
fread
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 );
  ...
}
理想情况下,函数应该通过参数、返回值和异常(如果可用)进行通信;通过全局变量共享状态会导致维护问题