我用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
答案 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
的参数个数是变量。