首先读取一个二进制文件,然后将内容分批写入一个动态数组,再将这个动态数组的内容写入一个文件,照理说,这个新文件跟原来的文件内容应该是一样的,但写入后却是不一样的。例如说,这个二进制文件是个图形文件,进行上面的操作后,新文件就认不出是图形文件了。但如果文件不是分批读入的,而是一次性读入的,就不会有这些问题,一切都正常。
为什么?谢谢!!
代码如下:
   long total=0, count;
   FILE *src,*dest;
   src = fopen("src.bmp", "rb");
   dest = fopen("dest.bmp", "w+b");
   char *all = new char[];
   char exchangeStr[100];   while(!feof(src))
   {
count = fread(exchangeStr, sizeof(char), 100, src);
total += count;
strcat(all, exchangeStr);
   }
all[total] = '\0';   fwrite(all, sizeof(char), total, dest);

解决方案 »

  1.   

    我不是大侠,随便说两句^_^
    你的代码有两个地方值得推敲:
    1、char *all = new char[]; // 中括号里少点东西吧?
    2、strcat(all, exchangeStr); // 我想主要问题出在这一句,这是一个字符串连接函数,不能用来处理二进制字节数据,因为字符串是以空字符结尾的。如果遇到一个含'\0'的二进制数据流,那么结果将必然不是你所期望的。
      

  2.   

    同意楼上的,问题就在strcat(),是字符串连接的函数,不能处理普通数据而且,你all指针也没有向后移动
      

  3.   

    1、没有问题;
    2、同意楼上的意见,
    如果要分批写入,建议使用CFile对象,最好不要使用传统的C方法。
    CFile.Open("文件名",modeReadWrite|typeBinary);
    CFile.Write( 存储区起始地址指针, 存储区长度 );
      

  4.   

    谢谢楼上的几位的意见。不过在用,strcat时,'\0'是自动往后扩的,比方说,
    char src[10] = "123456";
    char dest[5] = "abcd";
    实际上,src长度是7,最后一个是'\0',
    如果进行strcat(src,dest),src的实际长度是11,最后是'\0'.应该是这样吧?我现在用memcpy已经解决这个问题了。现在的问题是,char *all = new char[]; 定义的动态数组最大好像是4096,我需要的是不限大小的动态数组呀。
      

  5.   

    嗨,就是一个size_t那么大了。