C / Получение строки строки из текстового файла и сохранение ее в массиве / указателе - PullRequest
2 голосов
/ 30 мая 2020

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

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

#define MAX_LINE 10000


int main()
{   
    FILE *fp = NULL;
    char line[MAX_LINE];
    char** lines = (char**) malloc(10000*200*sizeof(char));

    int count = 0;

    fp = fopen("test.txt","r");

    while(fgets(line,10000,fp)) {    
      lines[count] = line; 
      count++;
    } 

    fclose(fp);

    for(int i =0; i<2000;i++){
      printf("%s",lines[i]);
    }

    return 0;
}

предположим, что test.txt выглядит так:

Alice was beginning to get very tired of sitting by her sister on the
bank, and of having nothing to do: once or twice she had peeped into the
book her sister was reading, but it had no pictures or conversations in
it, and what is the use of a book, thought Alice without pictures or
conversations?

Когда я печатаю так, я получаю последнее предложение (в данном случае conversations?) в текстовом файле. Однако я хочу установить каждое отсканированное предложение из текстового файла на другой индекс в моем char **. Например, я хочу установить так:

lines[0] gives "Alice was beginning to get very tired of sitting by her sister on the"
lines[1] gives "bank, and of having nothing to do: once or twice she had peeped into the"
and so on.

Ответы [ 2 ]

0 голосов
/ 30 мая 2020

strdup решает проблему, освобождая ресурсы, как сказал Адриан, когда закончите.

int main()
{   
   FILE *fp = NULL;
   char line[MAX_LINE];
   char** lines = (char**) malloc(10000*200*sizeof(char));

   int count = 0;

   fp = fopen("test.txt","r");

   while(fgets(line,10000,fp)) {    
      lines[count] = strdup(line);
      count++;
   } 

   fclose(fp);

   for(int i =0; i<count;i++){
      printf("%s",lines[i]);
   }

   for (int i = 0; i < count; ++i) free(lines[i]);
   free(lines);

   return 0;
}

Если вы ищете более высокую производительность, посмотрите мое репо (https://github.com/PatrizioColomba/strvect)

0 голосов
/ 30 мая 2020

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

Вместо этого вы должны фактически скопируйте символы, используя функцию strcpy. Итак, вместо:

    lines[count] = line; // Just makes each pointer point to the same buffer

используйте:

    strcpy(lines[count], line); // Copies the CURRENT contents of "line"

У вас также есть серьезная проблема с тем, как вы используете свой буфер char** lines. Если вам нужен массив из 200 строк, каждая из которых имеет максимальную длину 10000 символов, вы должны распределить их следующим образом:

char** lines = malloc(200 * sizeof(char*)); // Make 200 pointers
// Now allocate 10000 chars to each of these pointers:
for (int i = 0; i < 200; ++i) lines[i] = malloc(10000 * sizeof(char));

Примечание: 200 буферов будут неинициализированы (содержат случайные данные), поэтому в ваш print l oop, вы должны использовать только те, в которые вы скопировали реальные данные, используя переменную count в качестве ограничения l oop:

for(int i = 0; i < count; i++) {
     printf("%s", lines[i]);
}

Кроме того, не забудьте освободить память, выделенная, когда вы закончите:

for (int i = 0; i < 200; ++i) free(lines[i]); // Free each line buffer...
free(lines); // ... then free the array of pointers itself
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...