我目前正在从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终止?
答案 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
。