巨菜的阿豪 2023-10-08 13:44 采纳率: 50%
浏览 13
已结题

c++文件二进制读写过程,INT16转char操作后产生的数据异常

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:

img


数据2:

img

不经过fileStringOpe()函数处理,文件比较如下(文件数据一样):

img

  • 写回答

2条回答 默认 最新

  • 陈一手 2023-10-08 13:49
    关注

    两种写法之间的主要区别在于写入的数据量不同。写法1将整个字符串写入,而写法2只写入了字符串的前两个字符。如果 streamIn 字符串的长度超过2个字符,那么写法1会将多余的字符也写入到文件中,而写法2只会写入前两个字符。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月18日
  • 已采纳回答 10月18日
  • 修改了问题 10月9日
  • 创建了问题 10月8日

悬赏问题

  • ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上
  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中
  • ¥15 请各位帮我看看是哪里出了问题
  • ¥15 vs2019的js智能提示
  • ¥15 关于#开发语言#的问题:FDTD建模问题图中代码没有报错,但是模型却变透明了
  • ¥15 uniapp的h5项目写一个抽奖动画