用换行符结束写时,行缓冲文件和非缓冲文件之间有区别吗?

时间:2018-10-10 12:43:39

标签: c flush buffering

我在那里,几乎要再次向分包商发送一封愤怒的邮件。他们使用Post而不是... $comment = new Comment(); $form = $this->createForm(CommentType::class, $comment); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $comment->setUser($this->getUser()); $em->persist($comment); $em->flush(); } 报告错误,我认为这是愚蠢的,因为printf(...)被(行)缓冲了。尤其是当我在一个断言处理程序中找到其中的一张照片时(可能以fprintf(stderr, ...)结尾,它不会刷新打开的文件)。

但是仔细看所有的印刷品,所有印刷品都以换行符结尾。而且由于stdout是行缓冲的(默认情况下),所以我想:同花顺是否有区别?

2 个答案:

答案 0 :(得分:1)

的确,如果流被行缓冲并且所有输出都以换行符结尾,那么为了确保输出不被延迟并且不因异常终止而不会丢失输出,行缓冲同样有效因为没有缓冲。 (如果在需要的地方连续使用fflush,则可以做出类似的陈述。)

但是,您所做的以及您所依赖的语句“ stdout是行缓冲的(默认情况下)”是错误的。相反,除了stderr以外,所有stdio文件默认情况下仅在连接到交互式设备时才被行缓冲(或可能没有缓冲)(tty)。否则它们将被完全缓冲。

每个7.21.3 文件,¶7(重点是我的):

  

在程序启动时,预定义了三个文本流,无需显式打开它们-标准输入(用于读取常规输入),标准输出(用于写入常规输出)和标准错误(用于写入诊断输出)。最初打开时,标准错误流未完全缓冲;当且仅当可以确定流不引用交互式设备时,标准输入流和标准输出流才被完全缓冲

和7.21.5.3 fopen函数,¶8:

  

打开后,当且仅当可以确定不引用交互式设备时,流才会完全缓冲。流的错误和文件结束指示符已清除。

答案 1 :(得分:0)

  

以换行符结尾时,行缓冲的文件和未缓冲的文件之间是否有区别?

     

同花顺有什么区别吗?

鉴于 flush 是“任何未写入的缓冲区内容都将传输到主机环境” C11dr§7.21.34

如果所有stdout输出都以'\n'结尾,并且该流是 unbuffered line buffered ,则随后的刷新不会可以做任何事情,因为没有未写入的数据。

C规范在这里有点松散。详细行为是定义的实现。最好使用fflush(stdout);以确保到那时为止已清除输出。 More info