如何将c程序的输出重定向到文件?

时间:2010-09-23 00:16:14

标签: c

我正在尝试将c程序的输出重定向到文件,即使由于输入数据问题而产生一些错误也是如此。我可以将输出但错误消息发送到文件。

有人知道怎么做吗?

4 个答案:

答案 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的系统下重定向实际文件描述符,则需要了解dupdup2系统调用。它们允许您复制文件描述符。

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