C fprintf()在ubuntu中不起作用

C fprintf()在ubuntu中不起作用,c,ubuntu,file-io,C,Ubuntu,File Io,我正在尝试学习C编程语言中的文件I/O概念。我使用的是GNU/Linux(Ubuntu 16.04 LTS),我的IDE是eclipse 3.8。当我试图通过fprintf()方法写入文件时,它不会创建任何文件,或者即使创建了文件,它也不会写入。我尝试按照建议使用fflush()或setbuf(file\u pointer,NULL)方法来解决此问题,但仍然没有更改。我想我把文件的地址写错了 代码如下: #include <stdio.h> int main(void){ F

我正在尝试学习C编程语言中的文件I/O概念。我使用的是GNU/Linux(Ubuntu 16.04 LTS),我的IDE是eclipse 3.8。当我试图通过
fprintf()
方法写入文件时,它不会创建任何文件,或者即使创建了文件,它也不会写入。我尝试按照建议使用
fflush()
setbuf(file\u pointer,NULL)
方法来解决此问题,但仍然没有更改。我想我把文件的地址写错了

代码如下:

#include <stdio.h>
int main(void){
    FILE *file_pointer;
    file_pointer=fopen("~/.textsfiless/test.txt","w+");
    setbuf(file_pointer,NULL);
    fprintf(file_pointer,"Testing...\n");
    fclose(file_pointer);
    return EXIT_SUCCESS;
}
#包括
内部主(空){
文件*文件\指针;
file_pointer=fopen(“~/.textsfile/test.txt”,“w+”);
setbuf(文件指针,NULL);
fprintf(文件指针,“测试…\n”);
fclose(文件指针);
返回退出成功;
}

有人能解释一下这里出了什么问题吗?

您对
fopen()
的调用很可能失败。您不需要在程序中进行任何检查以确保
fopen
正常工作。它可能没有,这可能是由于多种原因造成的,如路径拼写错误、文件或进程权限错误等

要查看实际发生的情况,您应该检查fopen的返回值:

#include <stdio.h>
int main(void){
    FILE *file_pointer;
    file_pointer=fopen("~/.textsfiless/test.txt","w+");
    if (file_pointer == NULL) {
        printf("Opening the file failed.");
        return EXIT_FAILURE;
    }
    setbuf(file_pointer,NULL);
    fprintf(file_pointer,"Testing...\n");
    fclose(file_pointer);
    return EXIT_SUCCESS;
}

在Linux上,
~/.textsfiless/test.txt
中的
~
不会被C库
fopen
扩展。。。当您在命令行上使用
~
时,它将由您的(但不是由使用它的程序,由shell执行某些操作启动)扩展到您的中;扩展名为。阅读您不太可能拥有名为
~
的目录

你应该读书

因此,您应该检查
fopen
是否失败(很可能它确实失败了)。如果您想在主目录中获取文件,最好使用
“home”
(或者&…)。看

也许更好的代码是:

 char*homedir = getenv("HOME");
 if (!homedir) { perror("getenv HOME"); exit(EXIT_FAILURE); };
 char pathbuf[512]; /// or perhaps PATH_MAX instead of 512
 snprintf(pathbuf, sizeof(pathbuf), 
          "%s/.textsfiless/test.txt", homedir);
 FILE *file_pointer = fopen(pathbuf, "r");
 if (!file_pointer) { perror(pathbuf); exit(EXIT_FAILURE); };
等等

请注意,您应该检查大多数(&)函数的故障。该函数用于在
stderr
上向用户报告错误

(学究般地说,我们甚至应该测试返回的长度低于
sizeof(pathbuf)
或者使用并测试失败;我将该测试作为练习留给读者)

一般来说,阅读您正在使用的每个外部函数的

注意(您的代码可能有一些,例如,
fprintf
NULL
流)。使用所有警告和调试信息编译代码(因此
gcc-Wall-g
)并使用
gdb
调试器。阅读


顺便说一句,看看并尝试你原来的(错误的)程序。你会学到很多关于它使用的方法。

为什么不;检查
fopen()
是否成功?检查
fopen
返回值,如果文件路径错误,它可能会失败。@LPs我确实如您所说更改了行的顺序,但仍然不起作用,因为这是问题之一。在使用它之前,请检查
if(file\u pointer!=NULL)
。@ErfanKhalaji尝试检查fopenAs的返回值,我猜我在问题中提到过,我使用的目录似乎不存在。但我总是这样使用目录,我没有问题。我想不出这里的文件目录是什么样子的。@ErfanKhalaji我在我的答案中添加了一段关于这个的内容。我做了你写的编辑,但仍然没有更改。你能把我的问题投赞成票吗?我真的没有发现这个问题有什么不对,但是人们投了反对票。@ErfanKhalaji:你的问题的不对之处在于你没有阅读文档,也没有在网络上进行足够的搜索。所以人们在这里投了反对票。@ErfanKhalaji请不要要求其他用户删除他们的答案。如果你想删除你的问题,请标记它以引起版主的注意,并解释为什么你想删除它。我想删除这个问题,但我不能。请删除您的答案。我认为没有理由删除我的答案。它已经被提升了不止一次,所以它并没有那么糟糕。。。。
 char*homedir = getenv("HOME");
 if (!homedir) { perror("getenv HOME"); exit(EXIT_FAILURE); };
 char pathbuf[512]; /// or perhaps PATH_MAX instead of 512
 snprintf(pathbuf, sizeof(pathbuf), 
          "%s/.textsfiless/test.txt", homedir);
 FILE *file_pointer = fopen(pathbuf, "r");
 if (!file_pointer) { perror(pathbuf); exit(EXIT_FAILURE); };