【问题标题】:errorreading values from a binary file c++从二进制文件c ++中读取值时出错
【发布时间】:2013-02-20 10:14:56
【问题描述】:

// 数组值是经过几次计算后设置的

 long int a1[356];
 long int b2[356];
 long int c3[356];

//写入二进制文件

ofstream output("h.h",ios::binary|ios::out|ios::app);

output.write((char*)a1,356*4);
output.write((char*)b2,356*4);
output.write((char*)c3,356*4);

//读作

long int *x=new long int[1424];
ifstream in("h.h",ios::binary|ios::in);

in.read((char*)x,1424);

vector<long int> e1;
vector<long int> e2;
vector<long int> e3;

for(int y=;y<=1424;y=y+4)
{
 // e1.push_back((int)x[i]);

}

我正在使用上述方法读取写入二进制文件的整数,但无法检索存储的值。 .谁能指出问题出在哪里?

谢谢!

【问题讨论】:

  • 请记住,long int 的大小实际上可能与 4 不同。请使用 sizeof(long int)
  • 你正在使用 ios::app 来追加数据,你确定你没有读取旧数据吗?
  • 我很清楚为什么我想要 ios::app。
  • 我是在检查尺寸后才使用它-@Joachim

标签: c++ io binary


【解决方案1】:

long int *x=new long int[1424];

您声明了一个指向 1424 long int 数组的指针。但是随着阅读

in.read((char*)x,1424);

您正在阅读 1424 个字节

在循环中,您循环遍历数组,但将 4 添加到索引,因此只有 x 的每四个元素被推回。


您应该首先考虑long 在 64 位机器上可能是 8 个字节。您也不需要动态分配数组。并且该数组应包含 356 个条目,就像您将其写入文件时一样。然后,您可以在读取调用中读取sizeof(x) 字节。最后在循环中,从 0 循环到 sizeof(x) / sizeof(x[0])

long int x[356];
ifstream in("h.h",ios::binary|ios::in);

in.read((char*) x, sizeof(x));

for(int y = 0; y < (sizeof(x) / sizeof(x[0])); y++)
{
}

如果你想将long int的内容读成std::vector,其实有一种“更简单”的方式,使用迭代器和标准C++算法:

std::vector<long int> e1;

std::ifstream in("h.h", std::ios::binary | std::ios::in);

std::copy_n(std::istream_iterator<long int>(in),
            356,
            std::back_inserter(e1));

上述语句声明了一个向量,打开一个文件,并将文件中的 356 个long int 条目复制到向量e1 中。

有关参考,请参阅std::istream_iteratorstd::back_inserter,当然还有std::copy_n


上面的 C++ 解决方案不起作用,所以我尝试了另一个:

std::vector<long> v(356);

std::ifstream in("h.h", std::ios::binary);

std::for_each(std::begin(v), std::end(v), [&in](long& v) {
    in.read(reinterpret_cast<char*>(&v), sizeof(v));
});

上面的解决方案已经用this program 测试过,它对我有用。

上述语句的目的是创建一个包含 356 个 long 条目的向量,打开文件,并一次将一个条目读入向量中。

【讨论】:

  • 谢谢。我之前意识到了这一点,但无法找出一种方法来考虑其他三个字节。有什么建议吗?
  • @user2090617 我已经更新了我的答案几次,一次是使用更“天真”的 C-ish 解决方案,一次使用更惯用的纯 C++ 解决方案。
  • 我尝试使用 copy_n ,测试返回垃圾值@Joachim
  • @user2090617 你确定你写的是正确的数据吗?您是否在同一台计算机上写入和读取文件?
  • 是的,我相信他们!
猜你喜欢
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
相关资源
最近更新 更多