大文件中的C ++文件读取错误

时间:2015-11-13 08:48:28

标签: c++ arrays algorithm

我正在用C ++编写一个算法,它将读取具有特定格式的数字的文件,然后正在读取的每个(数字减1)将是名为Amount的数组中的位置,它将是inicreased by 1.文件格式如此

  

10 5
     1 2 3 4 1 5 1 5 2 1

所有值都用空格分隔。第一行的前两个是变量N和M,第二行的值是将设置数组中将增加的位置的值。算法的一部分是:

    int N,M,i;

    FILE *read = fopen("data.in", "r");
    fscanf(read, "%d %d ", &N, &M);
    int Amount[M];
    fill_n(Amount,M, 0); 

    for( i =0; i < N; i++)
    {
        fscanf(read, "%d ", &K);
        Amount[K-1]++;
    }

这个算法对于少量数字没有问题,但我需要它可以处理多达100万个数字,在这种情况下它会崩溃。我应该改变什么?

1 个答案:

答案 0 :(得分:1)

程序崩溃是因为当M变为一百万个数字时,整数数组Ext.define('TestApp.Controllers.tbController', { extend: 'Ext.app.ViewController', singleton: true, alias: 'controller.tbTemplate', config:{stores: ['tbData'],}, requires: [ 'TestApp.store.tbData' ], windowOpened: function () { console.log(Ext.getStore('tbData')); } }); 无法分配足够的内存。

将内存分配到本地变量是来自堆栈部分,该部分是有限的(大约1 MB)。这意味着M只能取小于250000的值。

因此,更好的方法是使用new []来从堆部分分配内存。

stores: ['TestApp.store.tbData']

在退出程序之前,不要忘记在使用金额后使用Amount取消分配/返回从堆分配的内存。

int *Amount = new int[M];

因此,在合并上述更改后,上面的代码如下所示:

delete[]