我正在尝试用C编程语言学习文件I / O概念。我正在使用 GNU / Linux(Ubuntu 16.04 LTS),我的IDE eclipse 3.8 。当我尝试通过fprintf()
方法写入文件时,它不会创建任何文件,或者如果文件是创建的,它也不会写入文件。我尝试使用fflush()
或setbuf(file_pointer, NULL)
方法解决问题,但建议here但仍然没有变化。我想我正在以错误的方式写文件的地址。
以下是代码:
#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;
}
有人可以解释这里有什么问题吗?
答案 0 :(得分:4)
在Linux上,~
中的~/.textsfiless/test.txt
未被C库fopen
扩展...当您在命令行上使用~
时,它会被扩展为你的shell已经execve(2)(但不是程序使用它,由shell开始执行home directory ...)进入你的globbing;扩展称为glob(7)。阅读Advanced Linux Programming。您不太可能拥有名为~
的目录。
您应该阅读getenv(3)
所以你应该检查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); };
(或者getpwuid(3)&amp; getuid(2) ...)。见environ(7)
也许更好的代码可能是:
stderr
等等。
请注意,您应该检查大多数C standard library(&amp; POSIX)函数的失败。 perror(3)功能可用于在sizeof(pathbuf)
上向用户报告错误。
(讽刺的是,我们甚至应该测试snprintf(3)返回fprintf
以下的长度,或者使用并测试失败asprintf(3);我将该测试作为练习留给读取器)功能
更一般地说,阅读您正在使用的每个外部函数的documentation 。
谨防undefined behavior(您的代码可能有一些,例如NULL
到gcc -Wall -g
流。使用所有警告编译代码&amp;调试信息(所以gdb
)并使用[Net::Google::Drive::Simple][1]
调试器。阅读What every C programmer should know about undefined behavior.
BTW,查看strace(1)并尝试使用原始(错误)程序。您将学到很多关于其中使用的system calls。
答案 1 :(得分:3)
您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;
}
编辑:自从您发表评论以来,您错误的路径肯定是发生了什么。如果您正在从当前目录执行程序,并且您的文件位于当前目录中名为“textfiless”的文件夹中,并且您的文件名为“test.txt”,那么您可以像这样调用fopen
:
file_pointer=fopen("/textsfiless/test.txt","w+");