2010-04-09 57 views
0

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

我正在写一个简单的libpcap implimentation。以下是一个示例回调函数,它将产生相同的结果。我尝试删除缓冲并在打印后添加了一个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]); 
    } 
} 
+2

发布代码可能对我们有帮助。 – Jay 2010-04-09 07:16:20

+0

你能请出示一些代码吗?这可能有帮助。 – ereOn 2010-04-09 07:16:23

+0

小心分享示例源代码和输出? – ndim 2010-04-09 07:17:19

回答

7

stdio缓冲字符。除非另有说明,否则通常它只会在看到换行符时发出写入。如果你想要一个不同的行为,可以用其中的一些补救:

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

  • 或者,拨打setbuf(stdout, NULL);禁用缓冲。在做任何printf之前先做这件事。

  • 通过编码到平台特定API(如write(POSIX)或WriteFile(Windows))绕过stdio。通常我会建议不要这样,特别是对于像stdout ..

2

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

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

0

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

1

它被称为文件流缓冲。

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