【问题标题】:Write a character array with null values into a file stream将具有空值的字符数组写入文件流
【发布时间】:2019-07-03 21:17:34
【问题描述】:

我是 C++ 新手,但仍在研究文件流。我正在尝试将字符数组放入将使用十六进制编辑器查看的文件中。

我做了不同的字符串,但是每当我输入一个空字节时,文件就结束了。

ofstream stream;
char charArray[256];
for (int i = 0; i <= 255; i++)charArray[i] = i;
stream.open("C:\\testfile.myimg");
if (!stream.is_open()) exit(1);
stream << charArray << endl;
return 0;

我想输出具有升序值的字节,但是如果我从空字节开始,那么 c++ 认为字符数组在它开始之前就结束了

【问题讨论】:

    标签: c++ null stream


    【解决方案1】:

    代替:

    stream << charArray << endl;
    

    使用:

    stream.write(charArray, sizeof(charArray));
    stream.write("\n", 1);  // this is the newline part of std::endl
    stream.flush();         // this is the flush part of std::endl
    

    第一个假设您发送的是 null-terminated 字符串(因为您传递的是char* - 请参阅答案末尾的原因)。这就是为什么当代码遇到第一个值为0char,即'\0'(空终止符)时,它会停止。

    另一方面,第二种方法使用未格式化的输出写入,它不会关心 charArray 中的值 - 它会接受它(作为指向其第一个元素的指针)并写入 sizeof(charArray) 从指向stream 的指针开始的字节。这是安全的,因为它保证sizeof(char) == 1,因此sizeof(charArray) 将产生256

    您需要考虑的是数组衰减。在这种情况下它会起作用(sizeof 东西),但如果你只是将一个衰减的指针传递给数组的第一个元素,它就不会起作用。在这里阅读更多:what's array decaying?

    【讨论】:

    • 在写入原始数据时,您还应该以binary 模式打开文件。
    • @RemyLebeau 我完全明白为什么这是一个合乎逻辑的假设,但我很难真正找到消息来源说如果不以二进制模式打开它就无法工作。您能否提供有关此案例或其他可靠来源的标准部分?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多