用C ++复制部分文件

时间:2011-10-01 10:56:59

标签: c++ windows fwrite stdio fread

我目前正在忙于一个项目,我必须将一个部分从一个文件复制到另一个文件,所以我使用fread和fwrite创建了一个代码。但我遇到了一个问题:出于测试目的,我制作了一个应该复制整个文件的代码,但不知何故,代码创建的副本比原始文件大。请参阅我在下面的代码

             FILE *base_file;
             FILE *new_file;
             fpos_t curpos;
             int tmp;

             // Open the base file
             fopen_s(&base_file, "C:/base.dat", "rb");
             // Open the file which should contain the copy
             fopen_s(&new_file, "C:/new.dat", "w");

             // Get the filesize
             fseek(base_file, 0, SEEK_END);
             fgetpos(base_file, &curpos);
             fseek(base_file, 0, SEEK_SET);

             //Read and copy (it seems to go wrong here)
             for(int i = 0; i < curpos; i++){
                 fread (&tmp, 1, 1, base_file);
                 fwrite(&tmp, 1, 1, new_file);
             }

             fclose(base_file);
             fclose(new_file);

基本文件为525 kb,新文件为527kb。据我所知,发生此问题的部分是在有7个nullbytes的部分之后,并且副本在某些部分之后添加了一个'0D'(十六进制)。在ascii中,'0D'字符是'回车'。我想知道我的复制代码将回车符添加到文件中的原因是什么?据我所知,这个脚本应该只是工作,因为我只是读取基本文件,并直接将其复制到新文件,并且基本文件不包含这些回车。

2 个答案:

答案 0 :(得分:5)

您正在以文本模式打开目标文件,而不是二进制模式,因此新行翻译会在您的背后发生。将模式更改为"wb"

其他说明:

  1. 使用流而不是stdio。
  2. 不要逐字节写。使用更大的缓冲区,您的方法将永远用于更大的文件。

答案 1 :(得分:2)

请问“wb”而不是“w”修复它吗?