C ++读取大文件并将数据放入数组中

时间:2014-04-12 03:54:09

标签: c++ fstream sstream

我有一个包含500,000个随机(6-7位)数字的文件。我想将所有数字一次一个地写入数组。 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个元素时收到以下错误消息:      &#34; readfile.exe中0x60ad86f8处的未处理异常:0xC0000005:访问冲突读取位置0x003cb578。&#34;

以下是前18个要素:

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

任何线索?

2 个答案:

答案 0 :(得分:0)

在网上阅读有关序列化的内容。您不需要使用向量,但您可以创建自己的可序列化类。我预测这不是不允许的。因此序列化是一种简单地将类的二进制信息保存到文件的机制,允许您通过一些代码将其反序列化回内存。

答案 1 :(得分:0)

这是语法错误:

int* num_array = new int[];

您必须在括号内指定一个数字。根据您的描述,您可能想要:

int* num_array = new int[500000];

当然,你的循环也应该检查你不要超过你在这里选择的任何界限。

如果您的编译器没有抱怨该行,那么它必须是一些奇怪的编译器扩展。尝试在符合标准的模式下调用您的编译器(例如,g++使用-std=c++98-std=c++11-pedantic)。

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