C++ 将从套接字接收的数据写入C++;

C++ 将从套接字接收的数据写入C++;,c++,file,sockets,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(news

我目前正在从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…”,有时这很好,但从来不会出现在机器的控制台上。我的理解是,发生这种情况是因为
printf
当传递数组时,数组将打印数组的所有内容,直到它遇到空字符,但是
file.write
不会。请让我知道我的理解是否正确。另外,为了解决这个问题,我是否有办法使用
文件。write
的行为类似于printf,它只打印到找到空终止符为止

你的理解是正确的
printf
(以及所有is变体)将格式化文本写入输出流,直到在格式字符串中找到空字符(
\0
),并且字符串参数(
%s
)遵循相同的逻辑<另一方面,code>write处理字节并“忽略”值。它将不加区分地写入空值


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

您的理解是正确的
printf
(以及所有is变体)将格式化文本写入输出流,直到在格式字符串中找到空字符(
\0
),并且字符串参数(
%s
)遵循相同的逻辑<另一方面,code>write处理字节并“忽略”值。它将不加区分地写入空值


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

您使用的是
while
循环,该循环在第一次调用
recv()
之前检查
读取的字节数。改用
do/while
循环。您也没有正确输出读取的数据。输出数据时,需要考虑读取的字节数。您正在将太多字节写入
文件
,并且在终止
printf()
的缓冲区时不能为null

请尝试以下方法:

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);

您正在使用一个
while
循环,该循环在第一次调用
recv()
之前检查
bytes\u read
。改用
do/while
循环。您也没有正确输出读取的数据。输出数据时,需要考虑读取的字节数。您正在将太多字节写入
文件
,并且在终止
printf()
的缓冲区时不能为null

请尝试以下方法:

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\0您不应该写入比读取更多的字节,您应该使用类似
文件的内容。写入(缓冲区,字节\u读取)
好的,它将写入您在缓冲区中得到的任何内容。我不想打印\0\0您不应该写入比读取更多的字节,您应该使用类似
文件的内容。写入(缓冲区,字节\u读取)
感谢您的回答@mpromonet提出了这一建议,并且成功了。谢谢你回答这个问题@mpromonet提出了这一建议,并且成功了。谢谢你把这件事弄清楚