4

以前の質問に対するフォローアップの質問で、完全に回答されています。簡単に要約すると、巨大な配列を保持するクラスを作成する際に問題が発生しました (スタック オーバーフロー エラー)。回答では、代わりに std::vector を使用することを推奨するユーザーもいました。

データを読み込む関数は次のようになります。

Test()
{
   memset(myarray, 0, sizeof(myarray));
   FILE* fstr = fopen("myfile.dat", "rb");
   size_t success= fread(myarray, sizeof(myarray), 1, fstr);
   fclose(fstr);
}

次のような myarray の場合:

int myarray[45000000];

私の質問は次のとおりです。これを望ましいものにするにはどうすればよいですか:

std::vector<int> myvector;

私は google を検索し、通常は次のコードを指している複数の回答を見つけました:

std::ifstream input("myfile.dat", std::ios::in | std::ifstream::binary);
std::copy(std::istream_iterator<int>(input), 
     std::istream_iterator<int>(), 
     std::back_inserter(myvector));

これを実装した後、 myvector.size() を呼び出すと、(何らかの理由で) 16 になり、ベクター要素にアクセスすると、ベクターの境界を超えてすぐにクラッシュします。

では、これを正しく行うにはどうすればよいでしょうか。「古い」メソッドを単純に使用して配列をベクターに読み込むことができることをどこかで読んだことがありますが、これはそもそもベクターを使用する目的を無効にしているようです。

4

2 に答える 2

6

fread()ファイルbinaryを読み取りますが、フォーマットされたint ( など)ifstream_iteratorを抽出しようとします。42

代わりにresize使用vectorしたい:input.read(...)

const size_t size = 45000000; // change this to the appropriate value
std::vector<char> myvector(size, 0);
std::ifstream input("myfile.dat", std::ios::in | std::ifstream::binary);
input.read(&myvector[0], myvector.size());

最初のパラメータが であると予想されるstd::vector<char>ため、 を使用する必要があることに注意してください。型を正しくキャストすれば、他の型を使用できます。readchar *T

input.read(reinterpret_cast<char*>(&myvector[0]), myvector.size() * sizeof(T));
于 2013-02-28T19:11:12.347 に答える
4

FILEC++ を使用している場合は、C API をすべて一緒に使用することを避けるようにしてください。これにより、正しい方向に進んでいます。あなたが抱えている問題は、istream_iterator入力をバイナリではなくテキストとして読み取ることです-ASCII数字が必要です。これは代わりにこれを出します:

std::vector<int> vec(45000000);

std::filebuf fb;
fb.open("myfile.dat", std::ios_base::in | std::ios_base::binary);
fb.sgetn((char*)&vec[0], vec.size() * sizeof(vec[0]));
于 2013-02-28T19:17:06.580 に答える