gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:01:46 28 4
gpt4 key购买 nike

我正在用 C++ 编写一个算法,该算法将读取一个包含特定格式数字的文件,然后正在读取的每个(数字减去 1)将是名为 Amount 的数组中的位置,并且它会增加1。文件格式是这样的

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

所有值都用空格分隔。第一行的前 2 个是变量 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 万个数字,在这种情况下它会崩溃。我应该改变什么?

最佳答案

程序崩溃,因为当 M 达到一百万个数字时,整数数组 Amount 无法分配足够的内存。

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

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

int *Amount = new int[M];

不要忘记在退出程序之前使用 amount 之后使用 delete[] 取消分配/返回从堆中分配的内存。

delete[] Amount;

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

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

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

//some logic

delete[] Amount;

关于c++ - 大文件中的 C++ 文件读取错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33688827/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com