无法使用fopen()打开文件

jet*_*jet 9 c file-io fopen stdio

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

#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);
}
Run Code Online (Sandbox Code Playgroud)

当我运行该文件时,"错误"被打印到控制台,就是这样.TestFile1.txt与我的.exe位于同一位置.我该如何解决?

小智 21

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

  • 如果你发现'perror`不够灵活,你也可以使用`printf("Error:%d(%s)\n",errno,strerror(errno))`甚至`printf("错误:%m \n ")`(一个Glibc扩展名). (12认同)

pax*_*blo 11

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

尝试使用中的完整路径名称fopen,看看是否修复了它.如果是这样,则问题如上所述.

例如:

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

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

顺便说一下,你可以插入一个简单的(分别用于Windows或Linux/UNIX/BSD/etc):

system ("cd")
system("pwd")
Run Code Online (Sandbox Code Playgroud)

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

  • 不需要反斜杠,这通常会导致那些在"fopen()"之类的问题上工作的人出现细微的错误.你应该建议使用正斜杠. (2认同)
  • 我既不推荐前向或后向斜杠,因为标准根本不要求文件名的格式.但是,如果你因为这个原因而投票,那么你就错过了这一点 - 目的只是为了证明使用完整的文件路径. (2认同)

Mar*_*off 5

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


小智 5

一点点错误检查有很长的路要走 - 您可以随时测试errno的值或调用perror()或strerror()以获取有关fopen()调用失败原因的更多信息.

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


Rob*_*ble 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);
    }
}
Run Code Online (Sandbox Code Playgroud)