fopen和fclose,跨函数传递文件

时间:2013-06-14 02:46:29

标签: c fopen fread fclose

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

3 个答案:

答案 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>

最好的方法是尽可能地保持文件的范围 - 这样可以更容易地阅读/维护代码并更快地发布资源。