• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zapis danych z pliku do listy jednokierunkowej

Object Storage Arubacloud
0 głosów
1,738 wizyt
pytanie zadane 12 maja 2017 w C i C++ przez AndekQR Użytkownik (880 p.)
void odczyt(struct dane **head)
{
    struct dane *nowy = (struct dane*)malloc(sizeof(struct dane));
    struct dane *point = *head;
    char bufor[30];
    printf("zmienne\n");
    FILE *plik;
    plik = fopen("test.txt", "r");

    if(plik == NULL)
        printf("Błąd podczas otwierania pliku!");
    else
    {
        while(fscanf(plik, "%d", bufor) != EOF)
        {
            struct dane *nowy = (struct dane*)malloc(sizeof(struct dane));
            printf("wejscie w while\n");

            nowy->next = NULL;

            nowy->id = (int*)malloc(sizeof(int));
            strcpy(nowy->id, bufor);

            fscanf(plik, "%s", bufor);
            strcpy(nowy->tytul, bufor);

            fscanf(plik, "%d", bufor);
            nowy->rok = (int*)malloc(sizeof(int));
            strcpy(nowy->rok, bufor);

            fscanf(plik, "%d", bufor);
            nowy->stan = (int*)malloc(sizeof(int));
            strcpy(nowy->stan, bufor);

            fscanf(plik, "%d", bufor);
            nowy->przesluchany = (int*)malloc(sizeof(int));
            strcpy(nowy->przesluchany, bufor);

            printf("po wszystkich strcpy\n");

            if(*head == NULL)
            {
                *head = nowy;
                printf("head = nowy\n");
            }
            else
            {
                while(point->next != NULL)
                {
                    point = point->next;
                    printf("point = point->next\n");
                }
                point->next = nowy;
                printf("point->next=point\n");
            }
        }
    }
    printf("odczyt udany");
    fclose(plik);
}

 

Witam

 

Mam problem z wczytywaniem danych do listy jednokierunkowej. Co należy zmienić w funkcji aby działała? 

Z góry dziękuje!

Plik z którego czyta wygląda tak: 

2
roko
1992
0
1

1
enej
2001
0
1

 

1 odpowiedź

0 głosów
odpowiedź 12 maja 2017 przez j23 Mędrzec (194,920 p.)
wybrane 12 maja 2017 przez AndekQR
 
Najlepsza

Tak na szybko:

if(*head == NULL)
{
        *head = point = nowy;
        printf("head = nowy\n");
}
void odczyt(struct dane **head)
{
	struct dane *nowy = (struct dane*)malloc(sizeof(struct dane)); //<--- po co ten 'nowy'...
	...
	
	 while(fscanf(plik, "%d", bufor) != EOF)
     {
		struct dane *nowy = (struct dane*)malloc(sizeof(struct dane)); // <--- ...jeśli jest ten?
		...

 

komentarz 12 maja 2017 przez AndekQR Użytkownik (880 p.)
Jest już lepiej, odczytuje lecz gdy wyświetlam te dane ukazuje się takie coś:

ID: 6950224
Tytul: roko
Artysta: =Windows_NT
Gatunek: \CodeBlocks\MinGW\bin;Çj
Rok: 6950528
Kupiony: Nie
Przesluchany: Nie

 

ID: 6950680
Tytul: enej
Artysta: em32\WindowsPowerShell\v1.0;C:\Program Files (x86)\N(j
Gatunek: \Program Files (x86)\N(j
Rok: 6950696
Kupiony: Nie
Przesluchany: Nie
komentarz 12 maja 2017 przez j23 Mędrzec (194,920 p.)
edycja 12 maja 2017 przez j23
 (int*)malloc(sizeof(int));

Dlaczego dla inta alokujesz pamięć? Nie możesz po prostu w strukturze dać int id; itd?

nowy->id = (int*)malloc(sizeof(int));
strcpy(nowy->id, bufor);

strcpy do kopiowania wartości typu int? To nie może się udać. generalnie zamiast cyrkować z tym buforem, od razu czytaj do odpowiednich pól:

fscanf(plik, "%s", nowy->tytul);
fscanf(plik, "%d", &nowy->rok);
fscanf(plik, "%d", &nowy->stan);
fscanf(plik, "%d", &nowy->przesluchany);

Oczywiście rok, stan i przesluchany muszą być intami

 

komentarz 12 maja 2017 przez AndekQR Użytkownik (880 p.)
edycja 12 maja 2017 przez AndekQR

Niestety nadal mam problem Poprawiłem kod, lecz po wykonaniu:

void odczyt(struct dane **head)
{

    struct dane *point;
    printf("zmienne\n");
    FILE *plik;
    plik = fopen("dane.txt", "r");

    if(plik == NULL)
        printf("Błąd podczas otwierania pliku!");
    else
    {
        while(fgetc(plik) != EOF)
        {
            struct dane *nowy = (struct dane*)malloc(sizeof(struct dane));
            printf("wejscie w while\n");

            nowy->next = NULL;
            fscanf(plik, "%d", &nowy->id);
            fscanf(plik, "%s", nowy->tytul);
            fscanf(plik, "%s", nowy->artysta);
            fscanf(plik, "%s", nowy->gatunek);
            fscanf(plik, "%d", &nowy->rok);
            fscanf(plik, "%d", &nowy->stan);
            fscanf(plik, "%d", &nowy->przesluchany);

            printf("po wszystkich strcpy\n");

            if(*head == NULL)
            {
                *head = point = nowy;
                printf("head = nowy\n");
            }
            else
            {
                while(point->next != NULL)
                {
                    point = point->next;
                    printf("point = point->next\n");
                }
                point->next = nowy;
                printf("point->next=point\n");
            }
        }
    }
    printf("odczyt udany");
    fclose(plik);
}

ukazuje się:

ID: 11617264
Tytul: enej
Artysta: aea
Gatunek: reage
Rok: 2222
Kupiony: Nie
Przesluchany: Nie

ID: 11617264
Tytul: ie
Artysta: Nie
Gatunek: 2
Rok: 1348221509
Kupiony: Nie
Przesluchany: Nie

ID: 11617264
Tytul: ihanna
Artysta: rrr
Gatunek: rock
Rok: 2001
Kupiony: Nie
Przesluchany: Nie

ID: 11617264
Tytul: ak
Artysta: Tak
Gatunek: 1
Rok: 1633906508
Kupiony: Nie
Przesluchany: Nie

ID: 11617264
Tytul: nej
Artysta: asd
Gatunek: pop
Rok: 1992
Kupiony: Nie
Przesluchany: Nie

ID: 11617264
Tytul: ie
Artysta: Tak
Gatunek: ly 6 Model 94 Stepping 3, GenuineI
Rok: 539767584
Kupiony: Nie
Przesluchany: Nie

z pliku: 

3
enej
aea
reage
2222
0
0
2
rihanna
rrr
rock
2001
1
1
1
enej
asd
pop
1992
0
1

Jest dwa razy więcej węzłów niż być powinno po odczytaniu z pliku. Oraz w niektórych polach są błędne dane. Podejrzewam że jest zły warunek w pętli while, lecz nie mam pojęcia jaki byłby poprawny.

komentarz 12 maja 2017 przez j23 Mędrzec (194,920 p.)

Pokaż definicję struktury dane.

while(fgetc(plik) != EOF) { ... }

Pewny jesteś tego fgetc? Co rekord czytasz dodatkowo jeden znak, co może zaburzyć odczyt następnych rekordów. Tak bym to zrobił:

int id;

while(fscanf(plik, "%d", &id) == 1)
{
	struct dane *nowy = (struct dane*)malloc(sizeof(struct dane));
	nowy->next = NULL;
	
	nowy->id = id;
	
	fscanf(plik, "%s", nowy->tytul);
	fscanf(plik, "%s", nowy->artysta);
	...
	

 

komentarz 12 maja 2017 przez AndekQR Użytkownik (880 p.)

Moja struktura:
 

struct dane
{
    int id;
    char tytul[20];
    char artysta[30];
    char gatunek[20];
    int rok;
    int stan;
    int przesluchany;
    struct lista *next;
};

 

komentarz 12 maja 2017 przez j23 Mędrzec (194,920 p.)
OK. Popraw tę pętlę.

 

To na zaliczenie, czy coś bardziej użytkowego ma być?
komentarz 12 maja 2017 przez AndekQR Użytkownik (880 p.)
Gdy zmienię na kod podany przez Pana, w ogóle nie kompiluje się ponieważ nie jest zadeklarowane id. nowy->id także nie działa ponieważ przydział pamięci do nowy wykonuje się już w pęti while.

Tak, to jest praca do szkoły.
komentarz 12 maja 2017 przez j23 Mędrzec (194,920 p.)

nie kompiluje się ponieważ nie jest zadeklarowane id.

Jak nie jest, jak jest? Źle przepisałeś.

komentarz 12 maja 2017 przez AndekQR Użytkownik (880 p.)
Nie zauważyłem pierwszej linijki. Wczytuje już poprawną liczbę węzłów, lecz pole id nadal ma jakieś kosmiczne wartości.
komentarz 12 maja 2017 przez j23 Mędrzec (194,920 p.)

Sprawdź debugerem, czy fscanf poprawnie wczytuje tą wartość.

komentarz 12 maja 2017 przez AndekQR Użytkownik (880 p.)
Jeśli dobrze to wykonałem to w oknie "watch" debugera jest poprawna wartości pola id.
komentarz 12 maja 2017 przez j23 Mędrzec (194,920 p.)
To może coś z wyświetlaniem tej wartości jest nie tak. Trudno powiedzieć...
komentarz 12 maja 2017 przez AndekQR Użytkownik (880 p.)
Jakoś już sobie z tym poradzę, dziękuje za pomoc.

Podobne pytania

0 głosów
0 odpowiedzi 443 wizyt
0 głosów
1 odpowiedź 607 wizyt
pytanie zadane 19 stycznia 2019 w C i C++ przez dzuulie Nowicjusz (120 p.)
0 głosów
1 odpowiedź 155 wizyt
pytanie zadane 30 marca 2018 w JavaScript przez kubekszklany Gaduła (3,190 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...