Читать строки текстового файла в массив, используя двойной указатель и malloc - PullRequest
1 голос
/ 06 июня 2019

Я хочу прочитать строки текстового файла, и его содержание показано ниже.

первый
второй
третий

Я уже написал некоторый код, но результат отличался от ожидаемого.Я надеюсь, что вы можете мне немного помочь.(код ниже)

/*
content of test.txt

first
second
third
*/

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

int main() {
  // double pointer for two string lines
  // and the two string lines will be pointed by (char *) pointer
  FILE *fp = fopen("test.txt", "r");
  char **lst = malloc(3 * sizeof(char *));  // corrected 2 -> 3

  // read lines until feof(fp) is not Null
  // Only 2 lines will be read by this loop
  int i = 0;
  while (!feof(fp)) {
    char line[10];
    fgets(line, 10, fp);
    *(lst + i) = line;
    printf("%d : %s", i, *(lst + i));
    i++;
  }

  /*
  Result:

  0 : first
  1 : second
  2 : third     // Why was this line printed here?

  There are 3 lines, not 2 lines!
  */

  printf("\n\n");

  int j;
  for (j = 0; j < i; j++) {
    printf("%d : %s\n", j, *(lst + j));
  }

  /*
  result:

  0 : third
  1 : third
  2 : third

  The whole lines were not printed correctly!
  */

  free(lst);
  return 0;
}

Ожидаемый результат:

0: первый
1: второй
2: третий

Большое спасибо.

1 Ответ

1 голос
/ 06 июня 2019

Прежде всего, вы выделяете пространство для массива two char* s, и у вас есть одиночный статический буфер для строки.Но вы пытаетесь прочитать три строки.Как вы думаете, откуда берется пространство для струн?Вы не выделяете его.

Вам необходимо сопоставить различные числа: выделите массив из трех строк, а затем выделите три строковых буферов:

char **lst = malloc(3 * sizeof *lst);

for (int i = 0; i < 3; i++) {
    lst[i] = malloc(10);
    fgets(lst[i], 10, fp);
}

И не забудьте free все выделенные буферы впоследствии:

for (int i = 0; i < 3; i++) {
    free(lst[i]);
}
free(lst);

… конечно, этот код тоже не очень хорош, так как он жестко кодирует числострок, которые вы можете прочитать, и максимальная длина строки.Но это должно начать вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...