使用fopen()打不开文件

12

我一直在尝试打开文件并输出文本,但我一直遇到错误。所以我想从最基础的开始,只尝试打开文件。这是我的代码:

#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);
}

当我运行这个文件时,控制台会输出“Error”,然后就没有其他信息了。TestFile1.txt与我的.exe文件处于同一位置。我该如何解决这个问题?

8个回答

22

不要使用printf("Error");,而应该使用perror("Error"),它可以打印出实际的失败原因(例如权限问题、无效参数等)。


13
如果你认为 perror 不够灵活,你可以使用 printf("Error: %d (%s)\n", errno, strerror(errno)) 或者甚至是 printf("Error: %m\n")(这是 Glibc 的扩展功能)。 - ephemient

16

你是如何运行这个文件的?是通过命令行还是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之前,显示一下你实际所在的目录。


2
不需要反斜杠,因为这经常导致那些无法让 fopen() 等函数正常工作的人出现微妙错误。你应该推荐使用正斜杠。 - Roger Pate
2
我既不推荐使用正斜杠也不推荐反斜杠,因为标准根本没有规定文件名的格式。但如果你因为这个原因而投票反对,那么你就误解了重点——意图只是为了演示完整文件路径的使用。 - paxdiablo
请您看一下以下代码: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。 - phougatv
@barnes,提出一个“问题”,而不是留下评论。这样,你会得到更多的曝光率。作为一个有教养的猜测,我建议你在某个地方使用了“filename”,而应该使用“pFile”,或者反之亦然。 - paxdiablo

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);
    }
}

5

您的可执行文件工作目录可能设置为保存它的目录之外的其他目录。请检查您的IDE设置。


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

5
一点错误检查可以节省很多麻烦——您可以始终测试errno的值或调用perror()或strerror()以获取有关为什么fopen()调用失败的更多信息。
否则,关于检查路径的建议可能是正确的……最有可能的情况是您从IDE认为的目录中退出,并且没有您所期望的权限。

2

除了上述内容,您可能还想显示当前目录:

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

在gcc / glibc平台上,这应该可以无问题地工作。(我最熟悉这种类型的平台)。如果您使用的是Windows平台,则有一个问题讨论了getcwd和Visual Studio。


1

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


0

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

希望这可以帮助到您。


非常好的评论。现在我至少可以手动打开我的文件了。我该如何在Visual Studio的命令行中执行此操作?我尝试在XCode上添加参数,但是它对我来说并不起作用。我希望Visual Studio会给我更多的运气。谢谢! - jet
XCode和Visual Studio可能会设置不同的工作目录,但问题是相同的,解决方案也是一样的。您需要在应用程序中包含代码,以更改为您想要的目录。 - wadesworld

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接