【问题标题】:How do I call a function to close a file using FILE *fp如何使用 FILE *fp 调用函数来关闭文件
【发布时间】:2017-03-24 23:14:48
【问题描述】:

在 main 中,我创建了一个文件指针,将其传递给一个函数来打开它,我想要一个单独的函数来关闭文件,但我无法关闭文件。我错过了什么?

我没有收到错误,但我检查的方式表明文件没有关闭。

感谢您对此的帮助。

 int _tmain(int argc, _TCHAR* argv[])
{
    FILE *inFile, *outFile;
    FileOpen(&inFile, &outFile);
    FileClose(&inFile, &outFile);

    getch();
    return 0;
}

void FileOpen(FILE **inFile, FILE **outFile)
{
//--Open InFile--------------------------------
    if ((*inFile = fopen("a.txt","r")) == NULL){
        printf("\nError Opening File. ");
        exit(0);
    }
    else {
        printf("File Opened\n");
         }

//--Open OutFile--------------------------------
    if ((*outFile = fopen("b.txt","w")) == NULL){
        printf("\nError Opening File. ");
        exit(0);
    }
    else {
        printf("File Opened\n");
         }
}


void FileClose(FILE **inFile, FILE **outFile)
{
//--Close InFile----------
    if (fclose(*inFile)){
        printf("File Closed\n");
    }
    else {
         printf("\nError Closing InFile File. ");
    }

//--Close outFile---------
    if (fclose(*outFile)){
        printf("File Closed\n");

    }
    else {
         printf("\nError Closing OutFile File. ");
    }
 }

【问题讨论】:

  • 有时候就是这么简单 :) 谢谢!!

标签: c++ c function fclose file-pointer


【解决方案1】:

你误解了return valuefclose成功返回0,所以你需要检查if (fclose(*inFile) == 0)

【讨论】:

  • "so you need to check if (fclose(*inFile) == 0)" - 但是如果失败了怎么办?
  • @NeilButterworth:使用else 块?
  • 我的意思是如果 fclose() 失败,你有什么选择?我也很想知道是否有人遇到过 fclose() 失败,至少从软盘时代开始。
  • @NeilButterworth:这是难题之一。没有一个最佳答案,这取决于您的用例:如果数据是可选的(如临时日志),您可以忽略该错误。如果数据很关键,你可以abort()你的进程(这样更高级别的协议会重试,也许在其他地方)。或者你可以有进程内处理逻辑(例如询问用户)。文件不像内存或互斥锁那样完全是资源,你不能无条件地“释放”它们。错误表明外界存在问题,您的答案取决于您与外界的关系。
  • @NeilButterworth:我非常喜欢Kerrek 的回答,但它适用于需要采用系统方法进行错误处理的高级程序员。经验不足的程序员应该记录错误并继续。为什么?因为在大多数情况下,当 fclose() 失败时,是因为代码出现了错误,例如没有正确打开文件。大多数试图恢复的程序员,记录错误,然后重试,记录错误并重试,......让事情变得更糟。如果真的是致命错误,系统架构师早就想好要做什么了,系统会在没有你帮助的情况下恢复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-17
  • 2020-12-18
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多