如何在C ++中使用文件流将正确无符号的__int8数组读取和写入二进制文件

MasterUZ

我正在使用生成器来生成无符号__int8'ers的随机序列,然后使用ofstream.write()通过此方法将它们写入文件;

void CDataGenerator::GenerateRandom(std::string outputFileName, int length, bool UseEntireRange, int max) {
    std::ofstream file;
    file.open(outputFileName, std::ifstream::out | std::ifstream::binary);
    int count = 0;
    unsigned __int8* buf = new unsigned __int8[length];
    while (count < length-1) {
        int number = 0;
        if (UseEntireRange)
            number = rand();
        else {
            int rnd = rand();
            number = (int)((double)rnd / RAND_MAX * max);
        }
        int capacity = 0;
        if (number == 0)
            capacity = 1;
        else
            capacity = (int)(floor(log10(number)) + 1);
        for (int i = 0; i < capacity; ++i) {
            if (count >= length - 2)
                break;
            buf[count] = ((unsigned __int8)(number / (int)pow(10, capacity - i - 1)));
            number %= (int)pow(10, capacity - i - 1);
            ++count;            
        }       
        ++count;
        buf[count] = BCD_SEPARATOR;
    }
    file.write((__int8*)&buf[0], length);
    delete[] buf;
    file.close();   
}

在哪里 const static unsigned __int8 BCD_SEPARATOR = 0xff;

然后我尝试使用以下方法读取文件

unsigned __int8* CModel::GetRawData(std::string inputFileName, int &length) {
    std::ifstream file(inputFileName, std::ifstream::ate | std::ifstream::binary);
    length = file.tellg();
    file.close();
    file.open(inputFileName, std::ifstream::in | std::ifstream::binary);
    unsigned __int8* result = new unsigned __int8[length];
    file.read((__int8*)&result[0], length);
    file.close();
    return result;
}

我的测试生成器创建了这样的序列0x0 0xFF 0x5 0x6 0xFF 0x1 0x9 0xFF 0x8 0xFF但从读取流中我得到了0x0 0xCD 0x5 0x6 0xCD 0x1 0x9 0xCD 0x8 0xCD序列。显而易见,所有0xff都替换为0xcd。它与(__int8 *)强制转换有关,如何解决?

雅各布

了解了Visual Studio使用的CRT调试堆(我只是假设您使用的是Visual Studio),可以很好地猜测0xCD值来自未初始化的堆内存。问题就变成了:为什么在输出中看到了这一点?要弄清楚原因,您可以使用调试器简单地逐步执行GenerateRandom函数/读取代码。

由此可见问题出在哪里:

for (int i = 0; i < capacity; ++i) {
    if (count >= length - 2)
        break;
    buf[count] = ((unsigned __int8)(number / (int)pow(10, capacity - i - 1)));
    number %= (int)pow(10, capacity - i - 1);
    ++count; //Increment count ONCE
}

++count; //Increment count a SECOND time
buf[count] = BCD_SEPARATOR;

问题在于,当程序离开此处所示的for循环时,count已经增加一次,因此您的“ count”已经在缓冲区中的下一个未初始化的__int8处。然后,在将BCD_SEPARATOR写入缓冲区中的“ count”位置之前,请再次增加“ count”。这将导致程序跳过您实际需要BCD_SEPARATOR的位置。

接下来的问题是,由于在将BCD_SEPARATOR写入缓冲区后和下次进入上述for循环之间不会增加“计数”,因此您会立即覆盖BCD_SEPARATOR。

解决该问题的方法可能是像这样简单地交换内容:

buf[count] = BCD_SEPARATOR;
++count;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在C ++中使用混合文本和二进制文件读取大文件

来自分类Dev

不能正确地将大的无符号整数写入二进制文件-C ++

来自分类Dev

如何从二进制文件读取字符串/数组和int in c?

来自分类Dev

C:将字符数组(包含'1'和'0')写入文件中的二进制文件

来自分类Dev

将二进制文件读入int数组C ++

来自分类Dev

如何在Java中从二进制文件写入和读取学生对象

来自分类Dev

在C ++中向文件流写入/读取二进制字节/整数/长

来自分类Dev

C ++将二进制文件写入文件

来自分类Dev

在C ++中读取二进制文件的正确方法?

来自分类Dev

C#,从二进制文件写入和读取图像

来自分类Dev

将链接列表写入二进制文件(C)

来自分类Dev

如何在Linux上的C库中使用已编译的二进制文件?

来自分类Dev

将int写入二进制缓冲区(Android)并使用C ++读取

来自分类Dev

使用ifstream从C ++文件中读取二进制无符号短整数

来自分类Dev

如何将字符串数组写入二进制文件?

来自分类Dev

如何将结构数组的二进制副本写入文件

来自分类Dev

将float数组写入二进制文件C#

来自分类Dev

在C ++中从文件读取ASCII和二进制

来自分类Dev

如何在 iOS 中使用 FlutterStandardMessageCodec 写入/读取二进制数据?

来自分类Dev

无法将1和0的字符串写入二进制文件,C ++

来自分类Dev

读取二进制文件c

来自分类Dev

如何将压缩的二进制文件读取为浮点数数组

来自分类Dev

如何在Julia中读取二进制文件?

来自分类Dev

如何使用VBScript从二进制文件读取

来自分类Dev

如何使用VBScript从二进制文件读取

来自分类Dev

如何使用 WINAPI 读取整个二进制文件?

来自分类Dev

使用c以二进制模式读取文件

来自分类Dev

使用StringStream在C ++中读取二进制文件

来自分类Dev

如何在Java中将字节数组写入二进制文件

Related 相关文章

  1. 1

    如何在C ++中使用混合文本和二进制文件读取大文件

  2. 2

    不能正确地将大的无符号整数写入二进制文件-C ++

  3. 3

    如何从二进制文件读取字符串/数组和int in c?

  4. 4

    C:将字符数组(包含'1'和'0')写入文件中的二进制文件

  5. 5

    将二进制文件读入int数组C ++

  6. 6

    如何在Java中从二进制文件写入和读取学生对象

  7. 7

    在C ++中向文件流写入/读取二进制字节/整数/长

  8. 8

    C ++将二进制文件写入文件

  9. 9

    在C ++中读取二进制文件的正确方法?

  10. 10

    C#,从二进制文件写入和读取图像

  11. 11

    将链接列表写入二进制文件(C)

  12. 12

    如何在Linux上的C库中使用已编译的二进制文件?

  13. 13

    将int写入二进制缓冲区(Android)并使用C ++读取

  14. 14

    使用ifstream从C ++文件中读取二进制无符号短整数

  15. 15

    如何将字符串数组写入二进制文件?

  16. 16

    如何将结构数组的二进制副本写入文件

  17. 17

    将float数组写入二进制文件C#

  18. 18

    在C ++中从文件读取ASCII和二进制

  19. 19

    如何在 iOS 中使用 FlutterStandardMessageCodec 写入/读取二进制数据?

  20. 20

    无法将1和0的字符串写入二进制文件,C ++

  21. 21

    读取二进制文件c

  22. 22

    如何将压缩的二进制文件读取为浮点数数组

  23. 23

    如何在Julia中读取二进制文件?

  24. 24

    如何使用VBScript从二进制文件读取

  25. 25

    如何使用VBScript从二进制文件读取

  26. 26

    如何使用 WINAPI 读取整个二进制文件?

  27. 27

    使用c以二进制模式读取文件

  28. 28

    使用StringStream在C ++中读取二进制文件

  29. 29

    如何在Java中将字节数组写入二进制文件

热门标签

归档