无法将linux程序的输出存储到文件

时间:2015-08-31 08:39:22

标签: c linux shell printf

我有一个名为./mpace的简单程序(使用线程),它在线程函数中使用printf()。当我从终端运行它时,输出按原样打印,但是当我输入时:

**./mpace > text**

创建的文件为空。 有趣的是昨天它完美无缺。我打字:

echo "test" > text

检查此功能是否存在严重问题,但是有效。 那么,我的程序意外开始无法写入文件的原因是什么?

请注意,我不想在代码中使用fprintf(),因为时间消耗至关重要。

非常感谢,只需使用fflush(stdout)即可解决问题。我认为在一个新的行中打印会刷新频道,但正如paxdiablo在评论中解释的那样,它并没有:

Why does printf not flush after the call unless a newline is in the format string?

你是对的,应尽可能提供尽可能多的信息,但我认为为单个printf()共享100行代码会让你无法阅读。我认为这是一个糟糕的决定,因为不使用fflush,并且程序被信号终止的事实都导致问题并且应该已经知道。

2 个答案:

答案 0 :(得分:1)

可能是一个缓冲问题。 stdout仅在进入字符设备时才进行行缓冲。要检查这是否是问题,请在每次fflush(stdout)电话后手动拨打printf。确保在程序终止之前正确刷新stdout的输出缓冲区。

答案 1 :(得分:1)

好吧,可能是因为您使用的是> 而不是>> ,而且可能是某种程度上您的代码(顺便提一句,你没有&# 39; t share it )包含换行符(空白)并删除旧换行符。让我给你看一个例子。

假设我们有以下名为 file1.txt 的文件,其中包含以下信息:

Michael  
Jimmy
Dolores

我不会提取名称Jimmy并将输出重定向到另一个名为 file2.txt 的文件

cat file1.txt | grep "Jimmy" > file2.txt

现在file2.txt包含:

  

现在让我们运行此命令3-4次并再次检查该文件:

cat file2.txt

输出:

  

这是为什么?它应该是:

Jimmy
Jimmy
Jimmy
Jimmy

因为我使用了> 而不是>>。现在让我们再试一次:

michi@michi-laptop:~$ cat file1.txt | grep "Jimmy" >> file2.txt 
michi@michi-laptop:~$ cat file1.txt | grep "Jimmy" >> file2.txt 
michi@michi-laptop:~$ cat file1.txt | grep "Jimmy" >> file2.txt 
michi@michi-laptop:~$ cat file1.txt | grep "Jimmy" >> file2.txt

输出:

Jimmy
Jimmy
Jimmy
Jimmy
Jimmy

这可能是其中一个原因。

编辑: 我来了另一个简短的例子,让我们用Timmy修改Jimmy:

Michael
Timmy
Dolores

请记住file2.txt如下所示:

Jimmy
Jimmy
Jimmy
Jimmy
Jimmy

现在如果你跑:

cat file1.txt | grep "Jimmy" > file2.txt

由于> 而不是>> ,我只使用空文件, file1.txt