如何使用open()和printf()写入文件?

时间:2016-02-03 19:03:40

标签: c file-io printf output

我用open()打开一个文件,需要使用printf打印到该文件而没有输出到控制台。我该怎么做呢?我可以成功创建文件,并将printf创建到控制台,但这不正确。

int main(int argc, char *argv[]) {
    int fd;
    char *name = "helloworld";
    fd = open(name, O_CREAT);

    char *hi = "Hello World";
    printf("%s\n", hi);

    close(fd);
    exit(0);
}

我需要程序没有输出到控制台,但如果我查看文件helloworld,它应该写入“Hello World”。如:

prompt> ./hello
prompt> more helloworld
   Hello World

4 个答案:

答案 0 :(得分:3)

这是一个诀窍。

您需要将打开的文件描述符复制到文件描述符1,即stdout。然后,您可以使用printf

int main(int argc, char *argv[]){

    int fd;
    char *name = "helloworld";
    fd = open(name, O_WRONLY | O_CREAT, 0644);
    if (fd == -1) {
        perror("open failed");
        exit(1);
    }

    if (dup2(fd, 1) == -1) {
        perror("dup2 failed"); 
        exit(1);
    }

    // file descriptor 1, i.e. stdout, now points to the file
    // "helloworld" which is open for writing
    // You can now use printf which writes specifically to stdout

    char *hi = "Hello World";
    printf("%s\n", hi);

    exit(0);

}

答案 1 :(得分:1)

如果您使用open()打开文件,则会获得int文件描述符,您可以使用write()写入该文件描述符。

如果您使用fopen()打开文件,那么您将获得FILE*句柄并可以使用stdio系列函数向其写入内容,其中包括fprintf()fputs()

这是两个不同的抽象层次。 open()printf()家庭混在一起并不合适。你可以让它们与fdopen()一起工作,但混合抽象并不是一个好主意。

答案 2 :(得分:0)

您可以在使用printf之前关闭标准输出,以便将输出保存在您打开的文件目录中,而不是打印到控制台。

close(1); // close(STDOUT_FILENO);
fd = open(name, O_CREAT);

char *hi = "Hello World";
printf("%s\n", hi);

close(fd);

我假设printf()命令一次只能将输出打印到一个目录,如果不先关闭它,它将转到默认的标准输出目录。如果您找到一种方法将输出目录设置为fd而不关闭STDOUT_FILENO,请告诉我。

答案 3 :(得分:0)

如果使用fopen处理此问题,一个更简单的技巧是使用variadic macros,在预处理中,您可以用printf替换fprintf。代表宏中变量参数的...就像带有变量参数的函数声明中的变量一样。此技巧适用于C和C ++。例如:

#include <stdio.h>
#define printf(...) fprintf(File, __VA_ARGS__)

int main()
{
    FILE *File;

    File = fopen("file.txt", "w+");

    printf("Hello world!");

    fclose(File);

    return 0;
}

注意:之所以使用可变参数宏,是因为printf的参数个数是变量。