Wczytywanie z pliku tekstowego i przypisanie do listy jednokierunkowej [C]

0

Cześć,

Mam problem z programem, mianowicie mam za zadanie pobrać z pliku "tekst.txt" słowo po słowie oddzielone spacją i zapisać każde ze słów do węzła listy jednokierunkowej. I gdy pobieram z pliku słowo i zapisuje do zmiennej word , to gdy próbowałem wypisać to co pobiera fscanf to wszystko działa prawidłowo, ale gdy chcę to słowo przekazać w funkcji , aby utworzyć nowy węzeł w liście jednokierunkowej i przypisać to słowo do pola w strukturze , to gdy chcę wypisać całą listę , to w każdym węźle jest ostatni wyraz z tego pliku , a nie tak jak powinny być , to znaczy każde słowo zapisane w innym węźle. Siedzę już na tym drugi dzień i szukam po internecie ale nic nie pomaga.

Z góry dzięki za pomoc :)

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

typedef struct ListElement {
    int data;
    char *tekst;
    struct ListElement * next;
} ListElement_type;


void push_front(ListElement_type **head, int number,char *slowo)
{

    ListElement_type *current;
    current=(ListElement_type *)malloc(sizeof(ListElement_type));

    current->data=number;
    current->tekst=slowo;
    current->next=(*head);
    (*head)=current;

}

void print_list(ListElement_type **head){
    ListElement_type* curr=(*head);
    while(curr!=NULL){
        printf("%d %s\n",curr->data,curr->tekst);
        curr=curr->next;
    }
}

int main()
{
    ListElement_type *head;
    head = (ListElement_type *)malloc(sizeof(ListElement_type));
    head=NULL;

    FILE *plik=fopen("tekst.txt","r");
    char word[20];
    int i=1;
    while(fscanf(plik,"%s",word)!=EOF){
        push_front(&head,i,word);
        i++;
    }
    print_list(&head);
    fclose(plik);
    return 0;
}
1

Zgadza się. Podpowiedź: nie alokujesz osobnej pamięci dla elementu struktury ->tekst, a tylko przypisujesz jej adres pamięci tablicy znaków word, w której trzymasz ostatnio przeczytane słowo. Dlatego po przeczytaniu wszystkich słów, wszystkie ->tekst wskazują na ostatnio przeczytane słowo, bo innych nigdzie nie zapisałeś.

0

Okej , mniej więcej rozumiem tylko , nie wiem gdzie muszę tą pamięć zaalokować , próbowałem zrobić coś takiego(dodając tą linie kodu do funkcji push_front) , ale dalej jest ten sam problem, czyli dalej muszę robić coś źle.

current->tekst=(char*)malloc(strlen(slowo)*sizeof(char));
1

Spróbuj ponownie, ale zaalokuj o 1 bajt więcej na końcowe '\0'. I potem rzeczywiście kopiuj do tej pamięci zawartość tablicy word, zamiast przypisania samego wskaźnika.

0

Poszło ,dzięki wielkie:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1