2013-05-06 3 views
2

Я хочу прочитать текстовый файл и поместить его в двумерный массив. Этот код работает для небольшого текстового файла, такого как 0 1 1 1 0 1 1 0 1 1 1 1, но дает ошибку сегментации для большого текстового файла и массива 648x512. В чем может быть проблема? Что может быть лучшим кодом для этого?чтение из файла и переход к двумерному массиву в C

Ссылка на большой текстовый файл:

http://mimoza.marmara.edu.tr/~omer.korcak/courses/CSE246%20-%20Spring2012/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; 

     } 
    } 
} 
+0

Добавить тег для языка - c или C++? – tgkprog

ответ

2

потому что вы используете слишком много пространства для стека. Main понадобится стек, достаточно большой для хранения M, который займет 512x648x (sizeof (int)). Предположим, что 4 байта int, это 1327104 байта только для одной переменной. В зависимости от вашей среды это очень много. Если вы собираетесь использовать больше, чем небольшую память, динамически выделите ее:

int M [] new int [C * R] или int M [] [] = new int [C] [R] (тот же diff , первый на самом деле проще работать с)

Cheers

+0

Спасибо за все объяснения динамического массива, но это помогло мне в части 512x648x (sizeof (int)). Вместо этого я использовал char, и он был локально оптимальным. ура – Bar

2

Когда размер массива велик, например: 648x512, M[R][C] используется все пространство стека вашей программы, таким образом, вы получите ошибку сегментации.

Попробуйте использовать динамический массив и не забудьте его освободить после использования.

int** M= new int*[R]; 
for(int i = 0; i < R; ++i) 
    M[i] = new int[C]; 
+1

есть ли способ увеличить размер? одна и та же программа работает в Java с ОЗУ по умолчанию. что, если мне нужно будет загрузить и использовать позже? – tgkprog

+0

Спасибо, но тогда как я могу достичь M [x] [y] -го элемента в этой матрице? Например, если я хочу передать его целочисленной переменной? – Bar