【问题标题】:std::array and bytes readingstd::array 和字节读取
【发布时间】:2015-11-04 16:01:17
【问题描述】:

我已经阅读了很多关于在 C++ 中不使用 C 风格,而是使用 std::array、std::vector 或 std::string 等容器的内容。

现在我正在尝试使用文件流读写小型二进制文件并将其存储在 std::array 中。

看起来 std::fstream 中的 read 和 write 方法只能用于 C 样式的数组...

这就是我的想法:

int main(int argc, char **argv)
{
    std::fstream testFile, outTestFile;
    testFile.open("D:/mc_svr/another/t/world/region/r.0.0.mca", std::fstream::in | std::fstream::binary);
    outTestFile.open("D:/mc_svr/another/t/world/region/xyz.xyz", std::fstream::out | std::fstream::binary);

    std::array<byte_t, 8192> testArray;

    testFile.read((char*) &testArray, 8192);
    outTestFile.write((char*) &testArray, 8192);

    testFile.close();
    outTestFile.close();

    return 0;
}

byte_t 只是一个

typedef char byte_t;

它有效。但这是做到这一点的好方法吗?如果没有,还有什么其他方法可以做到这一点?我应该改用 byte_t [] 吗?

【问题讨论】:

  • 您显示的代码绝对不起作用,至少不像您期望的那样。当你这样做时outTestFile.write((char*) &amp;testArray, 8192); 你写的是 testArray object 而不是 testArray 包装的实际数组。并且 read 和 write 函数可以读取和写入任意数据,它不必是 C 样式的数组(正如您从错误代码中看到的那样)。例如,要写入单个整数值,您可以执行例如outTestFile.write(reinterpret_cast&lt;char*&gt;(&amp;intVariable))
  • 好吧,在我的机器上工作正常,但这就是我问的原因:当然。感谢你的回复。编辑:是的,我知道如何读写其他类型的二进制数据(大多数数字)。
  • @JoachimPileborg 因为 std::array 可能除了数据之外没有其他成员,程序将按预期工作。虽然一般来说这样做是个坏主意。

标签: c++ c++11 fstream stdarray


【解决方案1】:

使用std::array::data:

testFile.read(testArray.data(), testArray.size());
outTestFile.write(testArray.data(), testArray.size());

注意使用.size() 而不是幻数。

您也不需要.close() 您的文件。 fstream 析构函数会为你做这件事。

【讨论】:

  • 非常感谢。我想有时我真的需要使用一些数字,尤其是当我不写整个数组的时候。我会记住 fstream 析构函数为我完成所有工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 2020-08-08
  • 2019-12-06
  • 1970-01-01
相关资源
最近更新 更多