fprintf()在ubuntu

时间:2016-10-24 08:23:02

标签: c ubuntu file-io

我正在尝试用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;
}

有人可以解释这里有什么问题吗?

2 个答案:

答案 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(您的代码可能有一些,例如NULLgcc -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+");