我正在尝试将文本文件复制到缓冲区,以便通过套接字发送它。只要文本文件没有任何换行符(或\ n),文件就会成功复制到缓冲区中。但是,只要文本文件中有多行,我就会收到错误,“无法将文件复制到缓冲区”。
以下是代码段:
//=====================Sending a File at Socket=========================
FILE *fp = fopen("File.txt", "r+");
char file_buffer[1000];
fseek(fp, 0, SEEK_END);
size_t file_size = ftell(fp); //calculating File Size
fseek(fp, 0, SEEK_SET);
int bytes_read=0;
if((bytes_read=fread(file_buffer, 1, file_size, fp))<=0)
{
MessageBox( NULL,
"Unable to copy file into buffer",
"Error!",
MB_ICONEXCLAMATION |
MB_OK);
exit(1);
}
MessageBox( NULL,
file_buffer,
"File copied in Buffer",
MB_ICONEXCLAMATION |
MB_OK);
注意: 如果文本文件不包含新行,则代码可以正常运行。
答案 0 :(得分:3)
简短回答
使用“rb +”模式而不是“r +”,
打开文件答案很长
您正在使用“r +”模式打开文件。使用该模式,所有“\ r \ n”序列(即Windows行结尾“)都被翻译为”\ n“(即Unix行结尾)。
但ftell返回的文件大小将为您提供真正的文件大小而无需翻译。
示例强>
File.txt的内容
12\r\n34
此文件的大小为6个字节
使用“r +”模式进行fread后的file_buffer内容:
12\n34
在这种情况下,fread的返回值为5。
使用“rb +”模式进行fread后的file_buffer内容:
12\r\n34
在这种情况下,fread的返回值为6.您可以使用调试器进行检查。阅读fopen的文档。
代码中存在更多问题
您对MessageBox的调用将显示文件内容,可能后跟垃圾,因为您没有放置零终止符。
在致电fread
后将其添加到您的计划中file_buffer[bytes_read] = 0 ;
通过测试其返回值是否为&lt;来测试fread的错误条件。 0不正确;无论如何,fread的返回值类型是size_t(无符号)而不是int,写size_t bytes_read=0;
而不是int bytes_read=0;
摘自fread文档:
fread返回实际读取的完整项目数,可能是 如果发生错误或文件结尾,则小于计数 在达到计数之前遇到过使用feof或ferror功能 区分读取错误和文件结束条件。如果大小或 count为0,fread返回0且缓冲区内容不变。如果 stream或buffer是一个空指针,fread调用invalid 参数处理程序,如参数验证中所述。如果执行 允许继续,此函数将errno设置为EINVAL并返回 0