将从套接字接收的数据写入C++中的文件
Writing data received from a socket to a file in C++
我目前正在从一台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字符(