C 不允许我写入这个文件有什么原因吗?

rpe*_*ger 1 c windows error-handling fopen file

我是 C 语言新手,我正在尝试掌握文件处理的窍门。我尝试写入此文件,但它不起作用,我不确定为什么它不起作用,有人可以帮助我吗?

#include <stdio.h>
#include <stdlib.h>

int main(){
    
    FILE *f;
    f = fopen("out.txt","w+");
    if (f == NULL) {
        printf("ERROR");
        exit(-1);
    }
    char test[] = "HELLO";
    fprintf (f, "%s", test);
    fclose(f);
    return 0;
    
    
}
Run Code Online (Sandbox Code Playgroud)

当我检查文件是否已打开时,我不断收到“错误”消息:/

ike*_*ami 5

替换比较没用

printf("ERROR");
Run Code Online (Sandbox Code Playgroud)

perror("fopen");
Run Code Online (Sandbox Code Playgroud)

C 不需要fopen设置errno(由perror),但 POSIX 需要设置,并且 Linux 和 Windows 的常用编译器会设置它。


该错误几乎肯定是 EPERM(“权限被拒绝”)。该错误意味着以下情况之一:

  • 您无权访问该目录,
  • 您无权写入该目录(如果该文件不存在),
  • 您无权读取该目录(如果该文件存在),
  • 您无权修改该文件(如果该文件存在),或者
  • 该文件被另一个程序锁定(如果该文件存在)。

好吧,其他原因也是可能的,但可能性很小,我不知道它们会是什么。

您的程序尝试在当前目录中创建或修改文件。请注意,当前目录不一定是可执行文件所在的目录。您可能试图意外写入错误的目录。

  • 请注意,ISO C 不要求在失败时由“fopen”设置“errno”。这是 POSIX 的要求。因此,不保证“perror”提供有意义的错误消息。它可能只是打印类似“No Error”的内容,这会产生误导。因此,编写 `printf("ERROR");` 是报告函数 `fopen` 失败的正确可移植方法。然而,我仍然赞成这个答案,因为没有更好的解决方案,而且 OP 很可能使用一个平台,在该平台上“fopen”会在失败时设置“errno”。 (3认同)