c++在进行文件二进制读写操作时,最开始用的写法1进行写操作,写入的文件数据错误,后面改写为写法2正确。这两种有什么不一样吗?
inFile.open(tilefilename, ios::in | ios::binary);
newFile.open(tilefilename + ".new", ios::out | ios::binary);
char *inData = (char*)malloc(sizeof(char)*2);
//待实现其他(只实现了int16)
while (inFile.read(inData, sizeof(char) * 2)) {
char* streamIn = fileStringOpe(inData);//一个字符串转换函数
if (streamIn != NULL) {
////写法1
newFile.write(streamIn, sizeof(char) * 2);
//写法2
char streamTmp[2] = { streamIn[0],streamIn[1] };
newFile.write(streamTmp, sizeof(char) * 2);
}
}
20231009追加:
针对该问题,建立了一个demo进行了测试,声明一个char数组,向两个txt文件进行数据写,并进行文件比较。
测试结果发现,的确是fileStringOpe()函数产生的影响,但原因还未找出(猜测该函数操作后,char指针指向的值有些异常,致使使用char指针方式写入文件数据结果不一样),如下测试代码:
char* fileStringOpe(char inData[2]) {
unsigned char inTmp[2] = { inData[0],inData[1] };
INT16 tmp = (inTmp[1] << 8) | inTmp[0];
unsigned char retTmp[2];
retTmp[1] = (tmp >> 8);
retTmp[0] = tmp;
return (char*)retTmp;
}
int main()
{
fstream fileA, fileP;
fileA.open("F:\\xieph\\0918python_chg\\A\\p.terrain", ios::out | ios::binary);
fileP.open("F:\\xieph\\0918python_chg\\p\\p.terrain", ios::out | ios::binary);
fstream inFile;
inFile.open("F:\\xieph\\0918python_chg\\106.terrain", ios::in | ios::binary);
char inData[2] = {'\x01','\x01'};
char *test=fileStringOpe(inData);//char *test=inData;//不经过fileStringOpe操作
char streamArray[2] = { test[0],test[1] };
fileA.write(streamArray, sizeof(char) * 2);
fileP.write(test, sizeof(char) * 2);
inFile.close();
fileA.close();
fileP.close();
return 0;
}
经过fileStringOpe()函数处理,文件比较如下(相同代码运行结果,但文件数据不同):
数据1:
数据2:
不经过fileStringOpe()函数处理,文件比较如下(文件数据一样):