0

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

 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]);

}

我正在使用上述方法读取写入二进制文件的整数,因为我无法检索存储的值。. 有人可以指出问题出在哪里吗?

谢谢!

4

1 回答 1

1

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

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

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

您正在阅读 1424字节

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


您应该首先考虑在 64 位机器上可能long8个字节。您也不需要动态分配数组。并且该数组应包含 356 个条目,就像您将其写入文件时一样。然后,您可以sizeof(x)在 read 调用中读取字节。最后在循环中,您从 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入 a 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));

上述语句声明了一个向量,打开一个文件,并将文件中的 356long 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));
});

上面的解决方案已经用这个程序测试过了,它对我有用。

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

于 2013-02-20T10:17:56.693 回答