2016-01-06 43 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