我有一个名为./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,并且程序被信号终止的事实都导致问题并且应该已经知道。
答案 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