сохранение текстового файла в связанный список построчно в c - PullRequest
0 голосов
/ 22 января 2020

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

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

typedef struct node 
{
    char data;
    struct node *next;
}Element, *List;

List init(void);

int main (){

    List current, head, newnode;
    FILE *f = fopen("text.txt", "r");
    head = current = NULL;

    while (getc(f) != EOF){
        newnode = malloc(sizeof(Element));
        fgets(&newnode -> data, sizeof(newnode), f);
        newnode -> next = NULL;

        if(head == NULL){
            head = current = newnode;
        }
        else{
            current -> next = newnode;
            current = newnode;
        }

    }

    current = head;

    while(current != NULL){
        printf("%s", &current -> data);
        current = current -> next;
    }

    fclose(f);
    return 0;
}

И текст:

I stand amid the roar
Of a surf-tormented shore
And I hold within my hand
Grains of the golden sand
How few! yet how they creep
Through my fingers to the deep
While I weep while I weep
O God can I not grasp
Them with a tighter clasp
O God can I not save
One from the pitiless wave
Is all that we see or seem
But a dream within a dream

Но я получаю так:

 stnd midtheroa
f asur-tomened hor
nd  hod wthi myhan
rais o th godensan
ow ew!yethowthe crep
hrogh y fnges t th dep
hil I eepwhie Iwee
 Go ca I ot ras
hemwit a igher las
 Go ca I ot aveOnefro th piiles wve
s al tat e se o sem
ut  dram ithn adrem

пропускает некоторые и я думаю, что причина в том, что fgets каждый раз читает определенное количество символов. Но я не могу найти решение, чтобы сделать его таким, каким оно должно быть, и я не очень хорошо разбираюсь в концепции связанного списка. Я был бы очень благодарен за любую помощь и советы, чтобы заставить это работать и спасти мистера По от этой ерунды. PS: Это должно быть сделано с помощью C90, поэтому некоторые функции отключены.

1 Ответ

0 голосов
/ 22 января 2020

Примечание из комментариев: getc читает один символ из входного потока. Вам нужно проверить, находится ли входной поток в конце файла каким-либо другим способом.

Вы используете один char вместо массива char s. Используйте char data[51];, fgets(newnode->data, sizeof(newnode->data), f); и printf("%s", current->data);

...