繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM