无法将多行文本文件复制到缓冲区

时间:2013-05-08 05:05:27

标签: c windows winapi text-files

我正在尝试将文本文件复制到缓冲区,以便通过套接字发送它。只要文本文件没有任何换行符(或\ 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);

注意: 如果文本文件不包含新行,则代码可以正常运行。

1 个答案:

答案 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