2015-03-15 3 views
1

Я написал программу в C langage. У меня нет проблем при попытке запустить его с моим маленьким txt-файлом в качестве аргумента. К сожалению, когда я пытаюсь загрузить гораздо больший файл, я получаю ошибку сегментации (ядро сбрасывается. Даже одна строка моей основной функции не выполняется. Вот часть кода responisble для запуска и загрузки txt-файла в качестве аргумента argv [1] .. .Я действительно не вижу где файлы problem.Big Txt около 13 МБ Я работаю Linux (Ubuntu) Я был бы признателен за помощьОшибка сегментации при загрузке большого файла txt.file в программу C

#include <stdio.h> 
#include <stdlib.h> 

typedef struct 
{ 
    int x; 
    int y; 
    int wage; 
}Edge; 


int main(int argc, char *argv[]) { 

printf("Program starts"); 


int x,y,z; 
int counter = 1; 
int N,E; //node,edges 

FILE *fid; 
fid = fopen(argv[1],"r"); 

fscanf(fid,"%d%d",&N,&E); 

Edge Graph[E]; 
int visited[N+1]; 


    while(counter <= E){ 
     fscanf(fid, "%d%d%d", &x, &y,&z); 
     Graph[counter-1].x=x; 
     Graph[counter-1].y=y; 
     Graph[counter-1].wage=z; 
     counter=counter+1; 
    } 


printf("\nWe load all edges. Here is our Graph"); 
fclose(fid) ; 


printf("Program ends"); 
return 0; 


} 
+2

Если 'Graph' получает большой, попробуйте использовать динамическое выделение памяти:' Край * Graph = таНос (E * SizeOf (Грань)); если (Graph == NULL) {printf ("malloc failed E =% d \ n", E); exit (1)} '...' free (Graph); 'Сделайте то же самое для' visited'. Проверьте, правильно ли открыт файл 'if (fid == NULL) {printf (« невозможно открыть файл% s \ n », argv [1]); exit (1);}' – francis

+0

Чтобы определить, где проблема не удалась, добавьте 'fflush (stdout);' после 'printf()' операторов. 'sdtout' забуферирован. Или используйте отладчик, например 'gdb'. Взгляните на http://stackoverflow.com/questions/8969665/how-do-i-find-segmentation-fault-from-multiple-files-using-gdb – francis

ответ

2

Первые некоторые приближения:.

  • С 13 МБ данных ваш текстовый файл содержит, безусловно, более 1 миллиона ребер (при условии, что каждый узел x и y представляют в среднем 3 цифры, а затем пробел, wag e в среднем 1 цифра, за которым следует пробел) и не менее 1400 узлов.

  • Ваши массивы переменной длины График [E] и посещенные [N + 1] являются локальными переменными, поэтому сохраняются в стеке. Предполагая 4 байта на целое число, это более 12 МБ данных, чтобы положить на стек.

Объем данных, который вам требуется в стеке, превышает размер стека по умолчанию в большинстве систем Linux (8 МБ).

Вы можете рассмотреть возможность увеличения размера стека, как описано в this SO question.

Но вы должны действительно лучше рассмотреть динамическую allocaton:

Edge *Graph = calloc (sizeof(Edge),E); 
int *visited = calloc (sizeof(int), N+1); 
if (Graph==NULL || visited==NULL) { 
    printf ("Oops ! Out of memory (%d edges, %d notes) !!", E, N+1); 
    exit (1); // or some other kind of error handling 
} 
+0

Я постараюсь сделать то, что вы говорите. Надеюсь, это будет работать. – user3402584

+0

спасибо, что это сработало! – user3402584

Смежные вопросы