C fprintf()在ubuntu中不起作用
我正在尝试学习C编程语言中的文件I/O概念。我使用的是GNU/Linux(Ubuntu 16.04 LTS),我的IDE是eclipse 3.8。当我试图通过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
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); };