【问题标题】:C stdout printfC 标准输出 printf
【发布时间】:2010-04-09 07:14:29
【问题描述】:

我在打印数据时遇到了一个奇怪的问题。我使用 printf 打印一个 char* 字符串,然后再打印另一个。然而,第一个字符串的一部分没有被打印出来,当我打印第二个字符串时,第一个字符串的缺失部分被添加到那个字符串之前。这里发生了什么?

我正在编写一个简单的 libpcap 实现。这是一个将产生相同结果的示例回调函数。我尝试在打印后删除缓冲并添加 putchar('\n') ,但没有帮助。

void ParseData(u_char* useless, const struct pcap_pkthdr* pkthdr, const u_char* packet){
   int packetLen, i;
   packetLen = pkthdr->len;
   for (i = 0; i < packetLen; i++){
      putchar(packet[i]);
   }
}

【问题讨论】:

  • 你能显示一些代码吗?这可能会有所帮助。
  • 愿意分享示例源代码和输出吗?

标签: c printf stdout


【解决方案1】:

stdio 缓冲字符。除非您另有说明,否则它通常只会在看到换行符时才真正发出写入。如果您想要不同的行为,您可以通过以下方式进行补救:

  • 在您的第一个 printf 之后,调用 fflush(stdout); 以刷新缓冲区。

  • 或者,调用setbuf(stdout, NULL); 以禁用缓冲。在执行任何printfs 之前执行此操作。

  • 绕过stdio,通过编码为平台特定的API,如write (POSIX) 或WriteFile (Windows)。通常我会建议不要这样做,尤其是像stdout..

【讨论】:

    【解决方案2】:

    您的第一个 printf 结尾可能没有 '\n'。在某些情况下,当遇到“\n”时,数据可能会被缓冲并一起打印。

    但是,这只是一个猜测。如果您无法发布代码,请尝试上述方法。

    【讨论】:

      【解决方案3】:

      这叫做文件流缓冲。

      您可以使用setvbuf() 禁用它或更改缓冲区的大小。或者每次打印后只需fflush()。但是,当存在行终止符 (\n) 时,流缓冲区(通常)会被刷新。

      【讨论】:

        【解决方案4】:

        我有类似的经历,但这更多与双字节有关。我有 2 char* 背靠背定义。我在第一个字符串中读入了一些字符。原来是双字节,所以字符串的剩余部分溢出到第二个字符串。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-12
          • 2020-11-14
          • 1970-01-01
          • 1970-01-01
          • 2012-02-23
          • 2014-07-31
          相关资源
          最近更新 更多