奇怪的列表打印功能行为。如果我打印“\n”就可以工作,如果我删除它就不行

Posted

技术标签:

【中文标题】奇怪的列表打印功能行为。如果我打印“\\n”就可以工作,如果我删除它就不行【英文标题】:Weird list print function behaviour. Works if i print "\n", doesn't work if I remove it奇怪的列表打印功能行为。如果我打印“\n”就可以工作,如果我删除它就不行 【发布时间】:2011-11-14 21:28:44 【问题描述】:

有时 c++ 很重要。我真的想不出为什么这行不通,如果你们中的任何人知道,我会很高兴。

我在一个线程上每秒调用一次这个函数。

此代码有效(打印正在迭代的列表中的内容):

void DeltaList::print()

  pthread_mutex_lock (&mutex);
  printf("\n");
  list<Delta*>::iterator it;
  for(it=deltas.begin(); it!=deltas.end(); it++)
  
    printf("%d   ", (int) (*it)->timeleft);
  

  pthread_mutex_unlock (&mutex);

这个没有(没有打印):

void DeltaList::print()

  pthread_mutex_lock (&mutex);
  //printf("\n");
  list<Delta*>::iterator it;
  for(it=deltas.begin(); it!=deltas.end(); it++)
  
    printf("%d   ", (int) (*it)->timeleft);
  

  pthread_mutex_unlock (&mutex);

所以...?

【问题讨论】:

WORKS = 真正打印列表中的内容。 DOESN'T WORK = 什么都不做,什么也不打印。 printf 是我更改的代码的唯一部分。这对我来说太合乎逻辑了,我忘了提出这个问题,现在编辑它。 它会永远阻塞吗?即它是否会离开该功能? printf("\n") 强制刷新输出缓冲区。可能发生的情况是它正在打印到内部缓冲区,而您的打印量不足以强制它刷新。等待一段时间以填充缓冲区或强制刷新。 洛基是正确的。输出被缓冲,直到你打印足够的缓冲区来填充和刷新,如果没有明确地使用\n 或调用fflush(),你将看不到它。 【参考方案1】:

这与线程或 C++ 无关。操作系统正在缓冲您的输出,当 stdout 是控制台时,\n 会隐式刷新缓冲区。如果您希望每次调用都立即显示其输出,请在循环后调用 fflush(stdout)

【讨论】:

我从来没有想过这个.. 只是一个简单的问题(我现在不想尝试):如果我将太多字符(比如内存大小)打印到 stdout 而没有'\n'? 缓冲区填满时也会被刷新。 stdout 也会在调用exit() 或从main 返回时刷新,因此最终应该打印数据。【参考方案2】:

我猜这是因为 STDOUT 被缓冲了,打印 \n 会刷新缓冲区 - 请参阅 SO on printf \n behaviour

【讨论】:

【参考方案3】:

切换到使用 std::cerr 作为实验,我敢打赌它每次都打印得很好,因为标准错误没有被缓冲,而 cout/printf(标准输出)被缓冲。在末尾放置一个 std::endl 将缓冲刷新并为 cout 放置一个新行,这也应该可以工作。您还可以简单地处理标准输出并在流上调用刷新函数以确保将其打印到控制台,这将是相似的。

【讨论】:

以上是关于奇怪的列表打印功能行为。如果我打印“\n”就可以工作,如果我删除它就不行的主要内容,如果未能解决你的问题,请参考以下文章

在GoLang中使用嵌套结构打印struct的奇怪行为

是否可以使用python 3.6中的循环创建从1到n的数字列表,然后打印出来?

发送广播消息时的奇怪行为

用return来做题:检查列表的长度,如果大于2,那么仅仅保留前两个长度的内容,并将新内容打印

删除链表中的节点后,打印节点列表显示已删除节点

有没有办法使用 CUPS 库获取打印机的字节命令列表?