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

Writing data received from a socket to a file in C++

本文关键字:C++ 文件 数据 套接字      更新时间:2023-10-16

我目前正在从一台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: %sn", buffer); 
     }
}

现在,有时在我的文件中,我会在文件中得到一大堆"\00\00\00\00…",有时它很好,但从来没有出现在机器的控制台上。我的理解是,之所以会发生这种情况,是因为printf在传递数组时会打印数组的所有内容,直到它遇到null字符,而file.write不会。请告诉我我的理解是否正确。为了解决这个问题,我有没有办法让file.write表现得像printf一样,只打印直到找到NULL终止?

您使用的是while循环,该循环在首次调用recv()之前检查bytes_read。请改用do/while循环。您也没有正确输出读取的数据。输出数据时需要考虑bytes_read。您正在向file写入太多字节,并且未为null终止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: %.*sn", bytes_read, buffer); 
         //or: printf("Buffer: %*.*sn", bytes_read, bytes_read, buffer); 
     }
}
while (bytes_read > 0);

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

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