2015-02-11 42 views
0

我需要使用linux函數ssize_t write(int fd, const void *buf, size_t count);打印「word = n」(其中n在[0..10])中進行流式處理的函數。試圖使用fprintf,但它給出了奇怪的結果:程序在約1%的調用「woword = n」中打印,並且length例如「woword = 7」是7. Printf打印完好。我做錯了什麼,或者這是包?與printf和fprintf不同的結果

if ((id_result = open(out , O_WRONLY)) <= 0) { 
     fprintf(stderr, "%s : %s\n", currentDateTime().c_str(), "could not open output\0"); 
     ret = P_STREAMS_LOAD_ERROR; 
    } 

    void printProbability(int probability){ 
     char buf[50]; 
     memset(buf, '\0', 50); 
     int length = sprintf(buf, "word=%i\n\0", probability); 
     fprintf(stderr, "debug : word=%i len = %i\n\0", probability, length); 
     int result = write(id_result, buf, length); 
     if(result == -1){ 
     fprintf(stderr, "%s : %s\n", currentDateTime().c_str(), "error \n"); 
     } 
    } 

EDITED:

我所理解的,我們有2個theorys: 1)混合printf和寫 2)fprintf中使用 '\ 0' 和 '\ N'

int length = sprintf(buf, "word=%i", probability); 
int result = write(id_result, buf, length); 
write(id_result, "\n", 1); 

用這段代碼我仍然有同樣的錯誤

aa幫我:))

+1

你的C++代碼看起來很像C.如果你使用C++的類來處理字符串,流,文件等,你可能不會遇到這個問題。也沒有任何你會遇到的主要問題。 – Biffen 2015-02-11 17:19:34

+1

不需要在字符串末尾放置'\ 0',編譯器自動添加它。 – 2015-02-11 17:22:25

+1

您正在混合行緩衝和非行緩衝I/O。 – 2015-02-11 17:25:55

回答

3

如果您正在將呼叫穿插到printf(或write)和fprintf(stderr, ...),則輸出不一定按順序排列。有緩衝正在進行,並且實際輸出可能不會在行尾字符切換。

+0

嗯。我認爲'stdout'和'stderr'通常使用相同的緩衝區,並保持同步。 – 2015-02-11 17:32:07

+0

但我被添加fprintf調試錯誤:/ 沒有fprintf我仍然有同樣的錯誤 – fedden 2015-02-11 17:38:22

+0

@RSahu怎麼可能?他們可能會被重定向到不同的地方。 – 2015-02-11 17:40:22