odczyt danych z pliku tekstowego do listy jednokierunkowej

Odpowiedz Nowy wątek
2015-01-04 20:58
0

Jestem w trakcie pisania programu opartego na liście jednokierunkowej. Zatrzymałam się jednak na próbie odczytu danych z pliku tekstowego.
Ta konkretna funkcja wygląda u mnie tak:

void OdczytZPliku() {
    FILE* plik=fopen("plik.txt", "r");
    if(plik==NULL) {
        printf("brak pliku\n");
        return;
    }
    struct Dane *nowy=malloc(sizeof(struct Dane)), *pom=malloc(sizeof(struct Dane));
    while(!feof(plik)) {
        fscanf(plik, "%s %s %d-%d-%d %s %f %f %f", nowy->n, nowy->i, &nowy->rok, &nowy->msc, &nowy->d, nowy->m, &nowy->d1, &nowy->d2, &nowy->p);
        if(poczatek==NULL)
            poczatek=nowy;
        else {
            pom=poczatek;
            while(pom->nast!=NULL)
                pom=pom->nast;
            pom->nast=nowy;
        }

    }
    fclose(plik);
}

Wszystkie dane, które próbuje odczytać funkcją fscanf znajdują się w jednej linii w pliku. Cały program kompiluje mi się, ale kiedy chcę odwołać się do tej funkcji wywala mi błąd. Proszę o jakieś wskazówki, ponieważ siedzę nad tym już jakiś czas i nie mogę wymyślić nic, co by zadziałało.

Pozostało 580 znaków

2015-01-04 21:03
0
  1. while(fscanf(plik, "%s %s %d-%d-%d %s %f %f %f", nowy->n, nowy->i, &nowy->rok, &nowy->msc, &nowy->d, nowy->m, &nowy->d1, &nowy->d2, &nowy->p)==9
  2. Jeżeli musisz dodawać na koniec to zwyczajnie trzymaj adres ostatniego, bo inaczej tracisz całą przewagę list.
  3. Użyj struct Dane nowy; aby do niego wczytać.
  4. Skoro zwyczajnie przypisujesz: pom->nast=nowy; to musisz na każdym kroku przydzielać pamięć, jak ty sobie to wyobrażasz, dwa razy na początku przydzieliłeś pamięć a później w pętli wczytałeś milion elementów?

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2015-01-04 21:07

Pozostało 580 znaków

2015-01-04 21:35
0
_13th_Dragon napisał(a):

# Jeżeli musisz dodawać na koniec to zwyczajnie trzymaj adres ostatniego, bo inaczej tracisz całą przewagę list.

Czy mogę prosić o dokładniejsze rozwinięcie tego punktu, ponieważ nie do końca rozumiem dlaczego?

Pozostało 580 znaków

2015-01-04 21:40
0
struct Dane *head=NULL,*tail=NULL;
...
struct Dane tmp;
while(fscanf(... ,&tmp.p)==9)
  {
   struct Dane *nowy=malloc(sizeof(struct Dane));
   *nowy=tmp;
   nowy->nast=NULL;
   if(tail) tail->nast=nowy;
   else head=nowy;
   tail=nowy;
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-04 21:55
0

Dziękuję, teraz rozumiem. Jednak przy próbie otwarcia pliku wciąż wyskakuje błąd 'program przestał działać'... Natomiast kiedy plik nie istnieje, wtedy normalnie na ekranie zostaje wyświetlone 'brak pliku'.

Pozostało 580 znaków

2015-01-04 22:02
0

Kod lub ... do wróżbitów.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-05 13:36
0
void OdczytZPliku () {
    FILE* plik=fopen("plik.txt", "r");
    if(plik==NULL) {
        printf("brak pliku\n");
        return;
    }
    struct Dane *tail=NULL;
    poczatek=NULL;
    struct Dane nowy;
    while(fscanf(plik, "%s %s %d-%d-%d %s %f %f %f", nowy.n, nowy.i, &nowy.rok, &nowy.msc, &nowy.d, nowy.m, &nowy.d1, &nowy.d2, &nowy.p)==9) {
        struct Dane *pom=malloc(sizeof(struct Dane));
        *pom=nowy;
        pom->nast=NULL;
        if(tail!=NULL)
            tail->nast=pom;
        else
            poczatek=pom;
        tail=pom;
    }
    fclose(plik);
}

Pozostało 580 znaków

2015-01-05 14:19
0

Pokaż strukturę.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-05 14:22
0
struct Dane{
    char *n;
    char *i;
    int rok, msc, d;
    char *m;
    float d1;
    float d2;
    float p;
    struct Dane *nast;
};
struct Dane *poczatek=NULL;

Pozostało 580 znaków

2015-01-05 14:46
0

Pytanie za sto punktów: Na co wskazuje wskaźnik, który nie dostał do łap żadnego adresu?

Pozostało 580 znaków

2015-01-05 14:54
0

chyba nie potrafię powiedzieć na co wskazuje, ale wiem, że do takiego wskaźnika nie można się odwoływać ;) czyli błędem jest tu zapis zmiennych w strukturze?

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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