[英]Big File reading error in C++
我需要读取具有以下特定格式的c ++文件:
10 5
1 2 3 4 1 5 1 5 2 1
所有值都用空格分隔。 第一行的前2个分别是变量N和M,第二行的所有N个值都必须位于大小为N的名为S的数组中。我编写的代码对于此类文件没有问题,但是当涉及到具有数百万的真正大文件时,它不起作用,以此类推,我需要它来处理。 这是代码
int N,M;
FILE *read = fopen("file.in", "r");
fscanf(read, "%d %d ", &N, &M);
int S[N];
for( i =0; i < N; i++){
fscanf(read, "%d ", &S[i]);
}
我应该改变什么?
您正在使用可变大小的数组。 这不是标准的,并非所有编译器都支持。 如果您的编译器支持它,而您耗费了数百万美元,则将耗尽堆栈空间(堆栈溢出)。
或者,您可以将S定义为具有vector<int> S(N);
数百万个整数范围内存在多个潜在问题:
int
通常是32位,32位有符号整数的范围为-2 ^ 31到2 ^ 31-1,因此最大值为2,147,483,647。 您应该切换到64位整数。
您正在使用int S[N]
不是标准C ++的可变长度数组(VLA)(它是标准C99,但是...关于它是否是一个好主意的讨论)。 不过,重要的细节是,VLA存储在堆栈中:100万个32位int
为4 MB,200万个为8 MB,依此类推...检查您的默认堆栈大小,但可能小于8 MB ,因此您会有堆栈溢出的情况(您在正确的网站上寻求帮助!)。
因此,让我们切换到C ++并消除这些问题:
#include <cstdint> // for int64_t
#include <fstream>
#include <vector>
int main(int argc, char* argv[]) {
std::ifstream stream("data.txt");
int64_t n = 0, m = 0;
stream >> n >> m;
std::vector<int> data;
for (int64_t c = 0; c != n; ++c) {
int i = 0;
stream >> i;
data.push_back(i);
}
// do your best :)
}
首先,我们使用<cstdint>
int64_t
来消除整数溢出问题。 其次,我们使用流(输入文件流: ifstream
)来避免必须学习与每种整数类型关联的格式(这很痛苦)。 第三,我们使用vector
存储读取的数据,并消除了堆栈溢出问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.