0

500,000 の乱数 (6 ~ 7 桁) のファイルがあります。すべての数値を一度に 1 つずつ配列に書き込みたい。Vector はこのコードで問題なく動作しますが、先生が Vector の使用を許可しないのではないかと心配しています。これが私のコードです:

    int line_no = 0;
    int num;
int* num_array = new int[];

//Open file for input
fstream in_file("CSCI3380_final_project_dataset.txt", ios::in);

    //Test for file opening
if (!in_file)
{
    cout << "Cannot open words1.txt for reading" << endl;
    exit(-1);
}

//Read file
while(true)
{
    //Read one line at a time
    in_file >> num;

    //Test for eof
    if (in_file.eof())
      break;

    num_array[line_no] = num;

    //Increment array position
    line_no++;

}

//Close the file
in_file.close();

17 番目の要素を書き込もうとすると、次のエラー メッセージが表示されます。

最初の 18 要素は次のとおりです。

8809397
5937712
9169212
3467863
5730702
748737
6035700
577496
3601486
4490826
1749210
5058906
8252221
607331
5100676
1061913
3978612
2824658

手がかりはありますか?

4

2 に答える 2

0

シリアライゼーションについてウェブで読んでください。ベクトルを使用する必要はありませんが、独自のシリアル化可能なクラスを作成できます。私が予測するように、これは許可されていません。したがって、シリアライゼーションは、クラスのバイナリ情報をファイルに保存するメカニズムであり、少しのコードでメモリにデシリアライズできます。

于 2014-04-12T04:00:27.117 に答える
0

これは構文エラーです:

int* num_array = new int[];

括弧内に数字を指定する必要があります。あなたの説明に基づいて、おそらくあなたが望む:

int* num_array = new int[500000];

もちろん、ループでは、ここで選択した境界を超えていないことも確認する必要があります。

コンパイラがその行について文句を言わない場合、それは何らかの奇妙なコンパイラ拡張であるに違いありません。標準準拠モードでコンパイラを起動してみてください (たとえば、または、およびをg++使用する場合)。-std=c++98-std=c++11-pedantic

ファイルが長いことが判明した場合に、より小さい配列を割り当て、後でそれを拡大する場合。つまり、特定の数に達したらより大きな配列を割り当て、すべての値をコピーして、古い配列を削除します。

于 2014-04-12T05:03:29.547 に答える