【问题标题】:Unable to open a file with fopen()无法使用 fopen() 打开文件
【发布时间】:2010-12-17 07:40:09
【问题描述】:

我一直在尝试打开文件并输出文本,但我不断收到错误消息。所以我想我会从一开始就尝试打开文件。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#define CORRECT_PARAMETERS 3

int main(void)
{
    FILE *file;
    file = fopen("TestFile1.txt", "r");
    if (file == NULL) {
        printf("Error");
    }
    fclose(file);
}

当我运行文件时,“错误”会打印到控制台,仅此而已。 TestFile1.txt 与我的 .exe 位于同一位置。我该如何解决?

【问题讨论】:

    标签: c file-io fopen stdio


    【解决方案1】:

    您应该尝试perror("Error") 而不是printf("Error");,它可能会打印失败的实际原因(如权限问题、无效参数等)。

    【讨论】:

    • 如果你觉得perror不够灵活,你也可以使用printf("Error: %d (%s)\n", errno, strerror(errno))甚至printf("Error: %m\n")(一个Glibc扩展)。
    【解决方案2】:

    你是如何运行文件的?它是来自命令行还是来自 IDE?您的可执行文件所在的目录不一定是您的工作目录。

    尝试使用fopen 中的完整路径名,看看是否能解决问题。如果是这样,那么问题就是描述的。

    例如:

    file = fopen("c:\\MyDirectory\\TestFile1.txt", "r");
    file = fopen("/full/path/to/TestFile1.txt", "r");
    

    或者打开一个命令窗口并导航到你的可执行文件所在的目录,然后手动运行它。

    顺便说一句,您可以插入一个简单的(分别适用于 Windows 或 Linux/UNIX/BSD/等):

    system ("cd")
    system("pwd")
    

    fopen 之前显示您实际所在的目录。

    【讨论】:

    • 不需要反斜杠,这通常会导致人们在使fopen() 之类的东西工作时遇到问题的细微错误。你应该推荐正斜杠。
    • 我既不推荐使用正斜杠也不推荐使用反斜杠,因为该标准根本没有规定文件名的格式。但是,如果您因为这个原因而投反对票,那么您就错过了这一点 - 目的只是为了演示完整文件路径的使用。
    • 您能否看看以下内容:FILE *pFile = NULL; const char *filename = "E:/CODE/TEST/test.txt"; pFile = fopen(filename, "r"); 并告诉我我遗漏了什么或做错了什么。我也试过:const char *filename = "E:\\CODE\\TEST\\test.txt";。似乎没有任何效果。程序被执行,但在cmd 上没有打印任何内容。它显示以下警告:Warning 1 warning C4133: 'function' : incompatible types - from 'FILE *' to 'const char *。 IDE:VS 2013。
    • @barnes,问一个问题,不要发表评论。这样,您将获得更多曝光。作为一个有根据的猜测,我建议您在应该使用 pFile 的地方使用 filename,反之亦然。
    【解决方案3】:

    您的可执行文件的工作目录可能设置为不同于保存它的目录。检查您的 IDE 设置。

    【讨论】:

    • 是的。例如,Visual Studio 可能会将当前目录设置为解决方案 (.sln) 文件所在的位置,而 EXE 文件可能位于“Debug”文件夹中。
    【解决方案4】:

    一点点错误检查大有裨益——您始终可以测试 errno 的值或调用 perror() 或 strerror() 以获取有关 fopen() 调用失败原因的更多信息。

    否则有关检查路径的建议可能是正确的...很可能您不在您认为来自 IDE 的目录中并且没有您期望的权限。

    【讨论】:

      【解决方案5】:

      好了,现在你知道有问题了,下一步就是弄清楚到底是什么错误,当你编译和运行这个时会发生什么?:

      #include <stdio.h>
      #include <stdlib.h>
      
      int main(void)
      {
          FILE *file;
          file = fopen("TestFile1.txt", "r");
          if (file == NULL) {
            perror("Error");
          } else {
            fclose(file);
          }
      }
      

      【讨论】:

        【解决方案6】:

        除了上述之外,您可能对显示当前目录感兴趣:

        int MAX_PATH_LENGTH = 80;
        char* path[MAX_PATH_LENGTH];
        getcwd(path, MAX_PATH_LENGTH);
        printf("Current Directory = %s", path);
        

        这在 gcc/glibc 平台上应该可以正常工作。 (我最熟悉那种平台)。如果您在 Windows 类型平台上,有一个问题 posted here 谈到了 getcwd 和 Visual Studio。

        【讨论】:

          【解决方案7】:

          尝试使用文件名的绝对路径。如果您使用的是 Windows,请使用 getlasterror() 查看实际的错误消息。

          【讨论】:

            【解决方案8】:

            输出文件夹目录必须已配置为 IDE 中的某个其他目录。您可以更改它或将文件名替换为整个文件路径。

            希望这会有所帮助。

            【讨论】:

            • 伟大的 cmets。现在我至少可以通过这种方式手动打开我的文件。我将如何从 Visual Studio 中的命令行执行此操作?我通过添加参数在 XCode 上尝试了这个,但它对我来说并不奏效。我希望 Visual Studio 能给我更多的运气。谢谢!
            • XCode 和 Visual Studio 可能会设置不同的工作目录,但是问题是一样的,解决方法也是一样的。您需要在应用程序中包含更改为所需目录的代码。
            猜你喜欢
            • 1970-01-01
            • 2015-01-04
            • 1970-01-01
            • 1970-01-01
            • 2012-04-05
            • 1970-01-01
            • 2019-05-10
            • 1970-01-01
            相关资源
            最近更新 更多