将从套接字接收的数据写入C ++中的文件

时间:2016-01-06 19:34:55

标签: c++ file sockets

我目前正在从Windows计算机接收数据到具有以下实现的linux系统。它读取数据并将其写入文件

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终止?

2 个答案:

答案 0 :(得分:2)

您正在使用while循环,在第一次调用bytes_read之前检查recv()。请改用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);

答案 1 :(得分:1)

您的理解是正确的。 printf(以及所有变体)将格式化文本写入输出流,直到在格式字符串中找到NULL字符(\0),字符串参数(%s)遵循相同的逻辑。另一方面write处理字节和"忽略"价值观是什么。它会毫无区别地写入NULL。

如果要将格式化文本写入文件,请使用fprintf