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を追加するため、の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++)
{
}

内容をとして読みたい場合は、イテレータと標準のC ++アルゴリズムを使用しlong intstd::vector、実際には「より簡単な」方法があります。

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

上記の解決策はこのプログラムでテストされており、私にとってはうまくいきます。

上記のステートメントは、356エントリを含むベクターを作成しlong、ファイルを開き、一度に1つのエントリーをベクターに読み込みます。

于 2013-02-20T10:17:56.693 に答える