C++ 将从套接字接收的数据写入C++;
我目前正在从windows计算机接收数据到linux系统,该系统具有以下实现。它读取数据并将其写入文件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
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提出了这一建议,并且成功了。谢谢你把这件事弄清楚