2010-04-09 28 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)時,流緩衝區(通常)會被刷新。