我想读取一个文本文件,并把它的数据到一个二维数组。这段代码适用于像0 1 1 1 1 1 1 1 1 1 1这样的小文本文件,但是对于大文本文件和648x512数组会出现分割错误。有什么问题吗?还有什么更好的代码可以做到这一点呢?
链接到一个大文本文件:
http://mimoza.marmara.edu.tr/omer.korcak/课程/CSE246 % 20 - % 20 spring2012/squares.txt
#include<stdio.h>
FILE *input;
int x=0, y=0, R=0, C=0,c=0;
int main()
{
input = fopen("squares.txt", "r");
C = 512;
R = 648;
int M[R][C];
for(x = 0; x < R; ++x ) {
for(y = 0; y < C; ++y ) {
fscanf( input, "%d", &c );
M[x][y]=c;
}
}
}
因为您使用了太多的堆栈空间。Main将需要一个足够大的堆栈来容纳M,它将占用512x648x(sizeof(int))。假设是一个4字节的整型,一个变量就是1327104字节。这取决于你的环境,这是很多。如果你要使用更多的内存,动态分配它:
int M[] new int[C*R]或int M[][] = new int[C][R](相同的区别,第一个实际上更容易使用)
欢呼
当数组大小较大时,例如:648x512, M[R][C]
耗尽了程序的所有堆栈空间,因此会出现分段错误。
尝试使用动态数组,并记得在使用后释放它。
int** M= new int*[R];
for(int i = 0; i < R; ++i)
M[i] = new int[C];