0

我有一个包含 500,000 个随机(6-7 位)数字的文件。我想一次一个地将所有数字写入一个数组。Vector 将在此代码中完美运行,但恐怕我的老师不允许使用 Vectors。这是我的代码:

    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 个元素时,我收到以下错误消息:“readfile.exe 中 0x60ad86f8 处的未处理异常:0xC0000005:访问冲突读取位置 0x003cb578。”

以下是前 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++98or-std=c++11-pedantic)。

如果您想分配一个较小的数组,然后在文件变长时增大它;那么你将不得不专门做所有这些,即当你达到一定数量时分配更大的数组,并复制所有值,并删除旧数组。

于 2014-04-12T05:03:29.547 回答