c++中的大文件读取错误
Big File reading error in C++
我需要在c++中读取一个具有这种特定格式的文件:
5
1 2 3 4 1 5 1 5 2 1
所有值之间用空格分隔。第一行的前两个分别是变量N和M,第二行中所有的N个值都需要放在一个名为S的数组中,大小为N。我写的代码对这样的文件没有问题,但是当涉及到真正有数百万的大文件时,它就不起作用了,我需要它工作。下面是代码
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]);
}
我应该改变什么?
在百万整数范围内存在多个潜在问题:
-
int
通常为32位,32位有符号整数的取值范围为-2^31到2^31 - 1,因此最大值为2,147,483,647。你应该切换到64位整型 -
您正在使用
int S[N]
可变长度数组(VLA),这不是标准c++(它是标准C99,但…有关于这是不是一个好主意的讨论)。然而,重要的细节是VLA存储在堆栈上:32位int
的100万是4mb, 200万是8mb,等等……检查您的默认堆栈大小,但它可能小于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
来存储我们读取的数据,并且消除了堆栈溢出问题。
您正在使用可变大小的数组。这不是标准的,也不是所有编译器都支持。如果您的编译器支持它,并且以百万计,您将耗尽堆栈空间(堆栈溢出)。
或者,您可以将S定义为具有vector<int> S(N);
相关文章:
- C++-从文本文件读取矢量错误
- 增加 gil 读取图像错误
- C++访问冲突读取位置错误
- 使用DPI从C 函数中从SV中的读取值错误
- 使用 valgrind 时获得 int 变量指针的无效读取大小错误
- 使用 valgrind 的地图中的读取大小错误无效
- 瓦尔格林德无效读取大小 4 错误
- 无法修复访问冲突读取位置错误
- 为什么开始读取返回错误ENOMEM(_B)
- 如何修复访问冲突读取位置错误
- 从Android Java读取二进制错误UE4-C++
- VS 2012 调试 处理<文件时出现意外的符号读取器错误.exe>
- 处理 POSIX 套接字读取() 错误
- C、Linux 中的串行端口读取/打开错误
- C++:std::复制失败,出现访问冲突读取位置错误
- 从文本文件/文本流中读取Q字符串错误
- C++“访问冲突读取位置”错误
- (Qt)在尝试使用MainWindow上另一个小部件类的任何函数时出现读取访问错误
- read()返回在某些系统上读取的错误字节数
- 在c++中读取文件错误