【问题标题】:C++ Reading a Large File and Putting Data in an ArrayC++ 读取大文件并将数据放入数组
【发布时间】:2014-04-12 03:54:08
【问题描述】:

我有一个包含 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

有什么线索吗?

【问题讨论】:

  • std::vector 不允许?多么糟糕......
  • 我建议做if ( !(in_file &gt;&gt; num) ) break;。否则,如果由于文件结尾以外的任何原因导致读取失败,您的代码将进入无限循环。
  • ideone.com/OerlSE 就是一个例子。SO 上还有很多其他类似的东西。只需搜索“将文件读入数组”即可。

标签: c++ fstream sstream


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这是一个语法错误:

    int* num_array = new int[];
    

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

    int* num_array = new int[500000];
    

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-15
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多