2010-10-14 2 views
2

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

#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; 
} 
+0

Не используйте feof() для управления cond.http цикла: //c-faq.com/stdio/feof.html – Nyan

ответ

3

Вы только выделить один массив строк 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 и проверить возвращаемое значение, чтобы убедиться, что буферы не переполняются.

+0

Вы уверены, что fgets не будет нулевым прекратить буфер для длительного ввода? – Nyan

+1

Почему этот ответ был остановлен? –

1

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

x[i] = strdup(str); 

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

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

+0

strdup не ANSI C – user411313

0

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

x[i] = strdup(str); 
Смежные вопросы