【问题标题】:what is the reason for fopen's failure to open a filefopen无法打开文件的原因是什么
【发布时间】:2011-12-26 07:48:56
【问题描述】:

我有以下代码试图打开一个文本文件。

char frd[32]="word-list.txt";
   FILE *rd=fopen(frd,"rb");
   if(!rd)
       std::cout<<"Coudn't open file\t"<<frd;

我用的是vc 2010,文件在这个项目的debug目录下。 谁能告诉我为什么无法打开文件?

【问题讨论】:

  • 文档对哥本哈根故障类型有什么看法?应该有办法找出来。
  • 文件是否存在(在执行路径中)?
  • 检查文件和/或包含目录的权限。
  • 使用std::cout 意味着您不是在编写纯C(即C++)。您可能应该使用std::cerr。在我看来,最有可能造成问题的原因是当前目录不是您项目的调试目录 - 所以该文件不在当前目录中。错误号应确认该文件不存在。

标签: c++ fopen


【解决方案1】:
#include<stdio.h>
#include <errno.h>

int main()
{
errno = 0;
FILE *fb = fopen("/home/jeegar/filename","r");
if(fb==NULL)
    printf("its null");
else
    printf("working");


printf("Error %d \n", errno);


}

这样,如果 fopen 失败,它将设置错误号,您可以在此处找到这些错误号列表 http://pubs.opengroup.org/onlinepubs/009695399/functions/fopen.html

【讨论】:

  • 问题不在于打开文件。 'if(rd)' 被评估为真,因此消息行被执行。我应该使用 'if(rd=NULL)'
  • 如果 fopen() 失败,那么它将返回 NULL,因此 rd 现在在您编写的代码中将为 NULL if(!rd) [not if(rd)] 意味着它将在 rd 时执行将为 NULL,如果文件成功打开,则该消息将永远不会打印.. 如果你想使用 == 那么你应该写 if(rd==NULL) noy if(rd=NULL)
  • 请始终注意您在代码中以及在 SO 上输入的内容
【解决方案2】:

查看在发生错误时设置的 errno 变量。这是一个全局变量。已经有一段时间了,但可能包括 errno.h,它将为您提供定义。

【讨论】:

    【解决方案3】:

    你可以做man fopen - 它说Upon successful completion fopen() return a FILE pointer. Otherwise, NULL is returned and errno is set to indicate the error

    请检查文件是否存在于执行路径或你的程序中,检查errno

    【讨论】:

      【解决方案4】:

      r Open for reading (existing file only) and rb Open for reading (existing file only) in binary mode。确保您的工作目录中有该文件。

      【讨论】:

      • 我 100% 确定(据我所知)我在工作目录中有该文件。另外我试过不用二进制模式打开它,结果是一样的。
      猜你喜欢
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 2015-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      相关资源
      最近更新 更多