2015-04-09 2 views
0

Я пытаюсь прочитать файл в динамически распределенном массиве 2d, но я все равно получаю распечатку той же строки. Файл, который я помещаю в этот код, представляет собой .txt с 1000 строк. Печать в конце - это проверить, получает ли массив правильные данные. И, наконец, я пытаюсь перераспределить код, чтобы код соответствовал количеству строк для массивов. THANKSS :)Пытается прочитать файл в динамически распределенном массиве 2d

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



int main(void) 
{ 
    char buffer[349]; 
    char *del = ""; 
    int i = 0; 
    int count = 0; 
    int len = 100; 
    int row = 10; 
    int max = 10; 
    char** d; 

    d = malloc(row * sizeof(char*)); 

    for(i = 0; i < row; i++) 
    { 
     d[i] = malloc(349); 
    } 
    i = 0; 



    while (fgets(buffer, sizeof(buffer), stdin) != NULL) 
    { 
     d[i] = buffer; 
     i++; 
     if(i == max) 
     { 
      d = realloc(d, sizeof(d)*2); 

      for(i = max; i <= max*2; i++) 
      { 
       d[i] = malloc(349); 
      } 
      max = max * 2; 
      printf("reallocating to %d\n", max); 
     } 

    } 

    for(i = 0; i < 20; i++) 
    { 
     printf("%s\n", d[i]); 
     printf("%lu\n", sizeof(d[i])); 
    } 
} 

Пример строки в текстовом файле:

2152,1, MAIN, SOCW, 6390,006,22913, IND - Независимое исследование, 0,1,1,0,0,12 : 00 AM, 12: 00 AM, N, N, N, N, N, N, N, 01-20-2015,05-08-2015

И есть около 1000 строк, подобных этим в файле.

+0

1) 'd [я] = буфер;' 'изменение зЬгсру (d [я ], buffer); ' – BLUEPIXY

+0

2)' d = realloc (d, sizeof (d) * 2); '->' d = realloc (d, sizeof (* d) * max * 2); ' – BLUEPIXY

+0

3) 'for (i = max; i <= max * 2; i ++)' -> 'for (i = max; i BLUEPIXY

ответ

0

d не выглядит как «2D-массив» всего. Массивы смежны. Ваши ассигнования нет. Я рекомендую вам изменить тип d и избежать чрезмерных распределений.

char (*d)[349] = NULL; 
size_t d_size = 0; 

Проверьте d_size двоичную мощность (степень 2), чтобы определить, когда размер и размера удвоения:

if ((d_size & (d_size + 1)) == 0) { 
    void *temp = realloc(d, (2 * d_size + 1) * sizeof *d); 
    if (temp == NULL) { 
     perror(realloc); 
     exit(EXIT_FAILURE); 
    } 
    d = temp; 
} 

Потому что d начинается NULL и d_size бинарной мощности (0), проверка пропускной способности должна идти до назначения. В результате вы можете исключить buffer.

Нет необходимости хранить вместимость d, так как мы знаем, что это будет первая бинарная мощность, которую мы получаем, увеличивая число раз d_size. d_size будет ваш i, если хотите.


Это в сторону, BLUEPIXY дал решение ваших проблем в комментариях. С одной коррекции, это были:

  1. strcpy(d[i], buffer);
  2. d = realloc(d, sizeof(*d)*max*2);
  3. for(int j = max; j < max*2; j++){ d[j] = malloc(349);}
  4. printf("%zu\n", strlen(d[i]));

По крайней мере, эти четыре необходимы, чтобы получить вашу программу рабочий (независимо от того, что средства) , но вы должны также подумать об этих двух:

  • Когда d = realloc(d, ...); сбой и возвращает NULL, что произойдет с вашим предыдущим значением d? Он просачивается в воздух. Вы должны сохранить возвращаемое значение d в переменную temp (например, ниже) и проверить до NULL, прежде чем продолжить.
  • Не забудьте указать free любую имеющуюся у вас память malloc/realloc 'd.

Интегрируя, что некоторые из тех, кто до сих пор применяются в то, что я узнал до сих пор:

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

int main(void) 
{ 
    char (*d)[349] = NULL; 
    size_t d_size = 0; 

    for (;;) 
    { 
     if ((d_size & (d_size + 1)) == 0) 
     { 
      void *temp = realloc(d, (2 * d_size + 1) * sizeof *d); 
      if (temp == NULL) 
      { 
       break; 
      } 
      d = temp; 
     } 

     if (fgets(d[d_size], sizeof d[d_size], stdin) == NULL) { 
      break; 
     } 

     d_size++; 
    } 

    for (size_t i = 0; i < d_size; i++) 
    { 
     printf("%s\n", d[i]); 
     printf("%zu\n", strlen(d[i])); 
    } 

    free(d); 
} 
Смежные вопросы