2016-01-06 76 views
0

我目前正在從windows計算機接收數據到具有以下實現的linux系統。它在我的文件,有時讀取數據並將其寫入文件將從套接字接收的數據寫入C++文件

char buffer[4096]; 
int BUFSIZE=4096; 
std::ofstream file(INPUT_PS_FILE_NAME, std::ios::out|std::ios::binary); 
while (bytes_read > 0) 
{ 
    buffer[bytes_read] = 0; 
    bytes_read = recv(newsockfd, buffer, BUFSIZE - 1, 0); 
    if(bytes_read>0) { 
     file.write(buffer,BUFSIZE-1); 
     printf("Buffer: %s\n", buffer); 
    } 
} 

現在有時在我的文件,我會得到一大堆的「\ 00 \ 00 \ 00 \ 00 \ 00 ......」其罰款,但從來沒有在機器的控制檯上。我的理解是發生這種情況,因爲printf當傳遞一個數組將打印一個數組的所有內容,直到它遇到一個空字符file.write沒有。如果我的理解是正確的,請告訴我。此外,爲了解決這個問題有沒有辦法讓我file.write行爲像printf它只打印,直到找到NULL終止?

+0

那麼,它會寫什麼你回來在緩衝區中。 – OldProgrammer

+0

我不想打印\ 0 \ 0 – MistyD

+3

你不應該寫比你讀的更多的字節,你應該使用'file.write(buffer,bytes_read)' – mpromonet

回答

2

您正在使用while循環,該循環在recv()首次被調用之前會檢查bytes_read。改爲使用do/while循環。而且你也沒有正確輸出讀取的數據。輸出數據時需要考慮bytes_read。您正在寫太多字節到file,並且不會終止printf()的緩衝區。

試試這個:

char buffer[4096]; 
std::ofstream file(INPUT_PS_FILE_NAME, std::ios::out|std::ios::binary); 
do 
{ 
    bytes_read = recv(newsockfd, buffer, sizeof(buffer), 0); 
    if (bytes_read > 0) { 
     file.write(buffer, bytes_read); 
     printf("Buffer: %.*s\n", bytes_read, buffer); 
     //or: printf("Buffer: %*.*s\n", bytes_read, bytes_read, buffer); 
    } 
} 
while (bytes_read > 0); 
+0

謝謝你回答這個問題。 @mpromonet建議這一點,它的工作。感謝您解決這個問題 – MistyD

1

你的理解是正確的。 printf(且全部爲變體)將格式化文本寫入輸出流,直到在格式字符串中找到空字符(\0),並且字符串參數(%s)遵循相同的邏輯。另一方面,write處理字節並「忽略」這些值是什麼。它將毫無區別地寫NULL。

如果要將格式化文本寫入文件,請使用fprintf