我正在尝试将c程序的输出重定向到文件,即使由于输入数据问题而产生一些错误也是如此。我可以将输出但错误消息发送到文件。
有人知道怎么做吗?
答案 0 :(得分:7)
在C源代码中,您可以使用freopen()
重定向输出:
一般产出:
freopen("myfile.txt", "w", stdout);
错误:
freopen("myfile_err.txt", "w", stderr);
答案 1 :(得分:3)
(这个答案适用于bash shell和类似的风格。你没有指定你的环境,这类问题需要这个细节。)
我假设你知道“>”的基本重定向。除了STDOUT之外,还要捕获STDERR,请使用以下语法:
command > file-name 2>&1
有关标准流和数字的更多背景信息:
http://en.wikipedia.org/wiki/Standard_streams#Standard_input_.28stdin.29
答案 2 :(得分:2)
这取决于您的意思以及您正在使用的平台。通常,您可以从命令行完成此操作,这已在另一个答案中介绍。如果您使用此方法来完成此操作,您应该知道FILE * stderr
通常是立即(无缓冲)写入而FILE * stdout
可能被缓冲(通常是行缓冲),因此您可能会得到一些错误消息似乎比其他一些消息早打印,但实际上其他消息只是打印得很晚。
在C程序中,您也可以使用freopen
在stdio系统中执行类似的操作,这将影响FILE *
,因此您可以将fprintf(stderr, "fungus");
打印到除了stderr之外的其他内容通常会打印到。
但是,如果您想知道如何使程序在类似unix的系统下重定向实际文件描述符,则需要了解dup
和dup2
系统调用。它们允许您复制文件描述符。
int fd = open("some_file", O_WRONLY);
dup2(2,fd);
close(fd);
此代码将使“some_file”成为OS级别的新stderr。 dup2调用将关闭并替换文件描述符2(stderr,通常由FILE * stderr
使用,但如果调用freopen(x,y,stderr)
则不一定,因为这可能使FILE *stderr
使用不同的文件描述符)。
这是shell程序重定向程序输入和输出的方式。打开新程序需要的所有文件fork
,然后孩子使用dup2
设置新程序的文件描述符,然后关闭新程序赢得的所有文件'需要(通常只留下0,1和2打开),然后使用其中一个exec函数成为shell被告知运行的程序。 (其中一些并不完全准确,因为有些shell可能依赖于关闭exe标志)
答案 3 :(得分:0)
使用简单的linux命令可以将输出保存到文件中。这是一个简单的linux终端命令。
ls > file.txt
此命令的输出将存储到文件中。
就像你可以存储程序的输出一样,假设,目标文件名是a,运行以下命令将输出保存在文件中:
./a > file.txt