Как сохранить строку из текстового файла в массиве в C - PullRequest
2 голосов
/ 14 октября 2010

Я хочу прочитать текстовый файл в строковый массив и иметь возможность доступа к содержимому массива через цикл.Код, который я имею, позволяет мне хранить только последнюю строку текстового файла вместо всего файла;куда я иду не так?

#define MAX 10000

int main (int argc, char *argv[])
{
    FILE *fp;
    char str[MAX];
    char *x[MAX];
    int i =0;
    char y[MAX];

    if((fp = fopen("550.txt", "r"))==NULL) {
    printf("Cannot open file.\n");
    exit(1);}

    while(!feof(fp)) {
        while(fgets(str, sizeof str, fp)) {
            x[i]= str;
            printf("%s", str);
            printf("%s", *(x+i));
            i++;
        }
  }


for(i=0;i<100;i++){
    printf("%s", *(x+i));
}

   fclose(fp);

  return 0;
}

Ответы [ 3 ]

3 голосов
/ 14 октября 2010

Вы выделяете только один строковый массив str.На каждой итерации цикла вы просто перезаписываете str.Присвоение x[i] = str присваивает указателю значение str для x[i].Вы заметите, что каждый член массива x указывает на тот же самый буфер str в конце цикла.Вам необходимо создать несколько буферов.

Один из способов сделать это - определить максимальное количество строк, используя #define LINES 100, а затем объявить x следующим образом

char x[LINES][MAX];

, а затемвыполните strcpy на каждой итерации:

while(fgets(str, sizeof str, fp)) {
    strcpy(x[i], str);
    printf("%s", str);
    printf("%s", *(x+i));
    i++;
}

Обратите внимание, что вы должны рассмотреть использование метода strncpy вместо strcpy и проверьте возвращаемое значение, чтобы буферы не переполнялись.*

1 голос
/ 14 октября 2010

Вам нужно сделать копию каждой строки:

x[i] = strdup(str);

В данный момент вы делаете так, чтобы каждая x[i] указывала на один и тот же буфер, который будет содержать последнюю строкуфайл, как только вы закончите.

(Примечание: вам также нужно free() все строки x[i], которые вы создаете с помощью strdup().)

0 голосов
/ 14 октября 2010

Вы нигде не читаете строку, которую читаете.Он буферизуется в str, но вы перезаписываете его следующей строкой.использовать strdup.

x[i] = strdup(str);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...