今天用CFile的Write和Read成员函数进行大数据的读写,发现了奇怪的问题:
写入的数据大小与文件指针偏移大小不一样。下面的记录是在写入文件时的记录:
bufferSize:4,pos:4
bufferSize:63329,pos:63531
bufferSize:4,pos:63535
bufferSize:13560,pos:77121
bufferSize:4,pos:77125
bufferSize:886,pos:78014
......
记录中bufferSize为这次要写入的缓冲区的大小,而pos为写入文件后通过CFile::GetPosition()函数获取的当前文件所指的位置。可见,第一次写入的缓冲区大小为4,写入后文件指针位置为4,正确。可是接着写入63329大小的缓冲区,得到的文件指针位置却是63531,按道理应该是4+63329=63333才对啊。而且接下来的写入稍微大点的缓冲区就会发生同样的情况。
请问这是什么原因造成的?
另外读取数据也有同样的情况,本来读取10000,可是读取后文件指针却没有偏移10000.不解。代码很简单:
int CSaveBufferFile::SaveBuffer(BYTE *buffer, int bufferSize)
{
int saveSize=0;//暂时没有
//写入数据
mv_file.Write(buffer,bufferSize);
CString str;
str.Format(_T("bufferSize:%d,pos:%d"),bufferSize,mv_file.GetPosition());
theApp.m_serverLog.WriteLog(str);
return saveSize;
}

解决方案 »

  1.   

    写入的数据为图片经过zlib库压缩后的数据,按道理都是二进制数据,不会有什么特殊字符吧
      

  2.   

    刚刚做了测试,看来是应该有特殊字符了。我直接将buffer用memset全置为0后写入正常。可是究竟是什么特殊字符导致这个问题了呢?
      

  3.   

    估计是数据中的含有很多'\'对应的数值
    CFile打开的时候使用Binary方式试试,默认估计是Text方式的.实在不行就不用CFile,直接用c的文件函数来做,用b方式打开.