2016-06-06 6 views
-4

Мне нужно прочитать файл на C и создать int**.читать int ** из файла C

Это файл:

2 
-1,1,1,0,0,1 
1,-1,0,1,0 

Я делаю это:

FILE *fp = fopen("grafo.txt", "r"); 
char line[100]; 
int numLinea = 0; 
char** tokens; 

while (1) { 
    if (fgets(line,150, fp) == NULL) break; 
    if(numLinea == 0){ 
     NUMERO_NODOS = atoi(line); 
     nodos = (int **)malloc (NUMERO_NODOS*sizeof(int *)); 
    }else{ 
     tokens = str_split(line, ','); 
     if (tokens) { 
      for (int i = 0; *(tokens + i); i++) { 
       char* contactoNodo; 
       strcpy(contactoNodo, *(tokens + i)); 
       int numNodo = numLinea-1; 
       nodos[numNodo] = (int *) malloc (NUMERO_NODOS*sizeof(int)); 
       nodos[numNodo][i] = atoi(contactoNodo); 
       printf("nodos[%i][%i] = %i\n",numNodo,i,nodos[numNodo][i]); 
       printf("nodos[0][0] = %i\n",nodos[0][0]); 
       //free(contactoNodo); 
      } 
      printf("nodos[0][0] = %i\n",nodos[0][0]); 
      //free(tokens); 
     } 
    } 
    numLinea++; 
    //printf("%3d: %s", i, line); 
} 

И это выход:

nodos[0][0] = -1 
nodos[0][0] = -1 
nodos[0][1] = 1 
nodos[0][0] = -1163005939 
(...) 

Почему nodos[0][0] = -1163005939 во второй итерации цикл for?


РЕШЕНИЕ

LOL, это было что:

if(i==0){ 
     nodos[numNodo] = (int *) malloc (NUMERO_NODOS*sizeof(int)); 
} 

Я не могу поверить, что я не видел его. Спасибо MikeCAT !!!

+0

Пожалуйста, пост полный код, мы не должны догадаться, что, например, 'NUMERO_NODOS' должен быть. – EOF

+0

Вы вызывали * неопределенное поведение *, используя значение неинициализированной переменной 'contactoNodo', имеющее время автоматического хранения, которое является индексированным. – MikeCAT

+0

Использование значения в буфере, выделенном через 'malloc' и не инициализированное, также вызывает * неопределенное поведение *. – MikeCAT

ответ

0

Фатальные ошибки:

  • Вы вызывается неопределенное поведение используя значение из переменной неинициализированного contactoNodo, имеющий автоматическую продолжительность хранения, которая indeteminate.
  • Вы выбросили то, что читается на первой итерации, выделив новый буфер и перезаписав указатель на старый буфер, и снова вызвал неопределенное поведение, прочитав содержимое буфера, выделенного через malloc, и не инициализировался.

Предупреждения:

  • Вы должны пройти правильно (равна или меньше, чем фактический размер буфера) размер буфера для fgets(), чтобы избежать переполнения буфера.
  • Говорят, you shouldn't cast the result of malloc() in C.

Попробуйте это:

FILE *fp = fopen("grafo.txt", "r"); 
char line[100]; 
int numLinea = 0; 
char** tokens; 

while (1) { 
    /* use correct buffer size to avoid buffer overrun */ 
    if (fgets(line,sizeof(line), fp) == NULL) break; 
    if(numLinea == 0){ 
     NUMERO_NODOS = atoi(line); 
     /* remove cast of what is returned from malloc() */ 
     nodos = malloc (NUMERO_NODOS*sizeof(int *)); 
    }else{ 
     tokens = str_split(line, ','); 
     if (tokens) { 
      for (int i = 0; *(tokens + i); i++) { 
       char contactoNodo[100]; /* allocate buffer statically */ 
       strcpy(contactoNodo, *(tokens + i)); 
       int numNodo = numLinea-1; 
       if (i == 0) { /* allocate buffer in only the first iteration */ 
        /* remove cast of what is returned from malloc() */ 
        nodos[numNodo] = malloc (NUMERO_NODOS*sizeof(int)); 
       } 
       nodos[numNodo][i] = atoi(contactoNodo); 
       printf("nodos[%i][%i] = %i\n",numNodo,i,nodos[numNodo][i]); 
       printf("nodos[0][0] = %i\n",nodos[0][0]); 
       /* do not free() what is not allocated via memory management functions such as malloc() */ 
      } 
      printf("nodos[0][0] = %i\n",nodos[0][0]); 
      //free(tokens); 
     } 
    } 
    numLinea++; 
    //printf("%3d: %s", i, line); 
} 
Смежные вопросы