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

Odczyt danych z pliku

Object Storage Arubacloud
0 głosów
450 wizyt
pytanie zadane 2 czerwca 2017 w C i C++ przez AndekQR Użytkownik (880 p.)

Witam

Mam problem z odczytem danych mam taki oto plik tekstowy:

1
asd
A: sfdg
A: fhs
A: ery
A: xcvb
G: pop
G: rock
G: ssssss
34534
0
1

Co zrobić żeby program rozpoznawał wiersze rozpoczynające się od "A: " i wczytywał tam gdzie ja chce resztę znaków z tego samego wiersza? Analogicznie dla wierszy rozpoczynających się od" G: ".

Napisałem taką funkcje lecz nie działa. 

void odczyt(struct album **head_album, struct artysta **head_artysta, struct gatunek **head_gatunek)
{

    struct album *point;
    FILE *plik;
    plik = fopen("album.txt", "r");

    if(plik == NULL)
        printf("Blad podczas otwierania pliku!");
    else
    {
        int pomoc;
        while(feof(plik)==0)
        {
            struct album *nowy_album = (struct album*)malloc(sizeof(struct album));
            struct artysta *nowy_artysta = (struct artysta*)malloc(sizeof(struct artysta));
            struct gatunek *nowy_gatunek = (struct gatunek*)malloc(sizeof(struct gatunek));

            fscanf(plik, "%d", &nowy_album->id);
            fscanf(plik, "%s", nowy_album->tytul);
            while(feof(plik)==0)
            {
                if(getc(plik)==65)
                {
                    nowy_artysta->id_album=nowy_album->id;
                    fscanf(plik, "%s", nowy_artysta->imie);
                    fscanf(plik, "%s", nowy_artysta->nazwisko);
                    if(feof(plik)==0)
                        dodaj_artysta(head_artysta, nowy_artysta);
                }
            }
            while(feof(plik)==0)
            {
                if(getc(plik)==71)
                {
                    nowy_gatunek->id_albumu=nowy_album->id;
                    fscanf(plik, "%s", nowy_gatunek->nazwa);
                    if(feof(plik)==0)
                        dodaj_gatunek(head_gatunek, nowy_gatunek);
                }
            }
            fscanf(plik, "%d", &nowy_album->rok);
            fscanf(plik, "%d", &nowy_album->stan);
            fscanf(plik, "%d", &nowy_album->przesluchany);

            if(feof(plik)==0)
                dodaj_album(head_album, nowy_album);
        }
        printf("Odczyt udany!\n");
    }

    fclose(plik);
}

 

1 odpowiedź

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

Czytaj liniami:

char line[1024];

char* ret = fgets(line, 1024, plik);

while (ret != NULL)
{
	struct album *nowy_album = (struct album*)malloc(sizeof(struct album));
	sscanf(line, "%d", &nowy_album->id);

	fgets(line, 1024, plik);
	sscanf(line, "%s", nowy_album->tytul);
	
	while((ret = fgets(line, 1024, plik)) != NULL)
	{
        if(line[1] != ':') break;
		switch(line[0]) 
		{
		case 'A': 
			/* tu dodajesz artystę, czytając resztę zawartości 'line' */
			break;
		case 'G': 
			/* a tu gatunek */
			break;
		};
	}
}

 

komentarz 2 czerwca 2017 przez j23 Mędrzec (194,920 p.)

angry

Czy ja piszę z botem? Nie wiem, może to kwestia piątku... pijesz coś teraz?

 

I nie, to nie jest mój kod! Mój jest ten:

char line[1024];
  
char* ret = fgets(line, 1024, plik);
  
while (ret != NULL)
{
    int id;
    char tytul[100];
    int rok;
    int stan;
    int przesluchany;
     
     
    sscanf(line, "%d", &id);
     
    fgets(line, 1024, plik);
    strcpy(tytul, line);
 
    fgets(line, 1024, plik);
    sscanf(line, "%d", &rok);
 
    fgets(line, 1024, plik);
    sscanf(line, "%d", &stan);
 
    fgets(line, 1024, plik);
    sscanf(line, "%d", &przesluchany);
      
    printf("%d -> %s (rok: %d stan: %d przesl: %d)\n", id, tytul, rok, stan, przesluchany);
      
      
    while((ret = fgets(line, 1024, plik)) != NULL)
    {
        char* p = line;
         
        while(isspace(*p)) ++p;
         
        if(p[1] != ':') break;
 
        switch(*p) 
        {
        case 'A': 
            printf("artysta -> %s", p + 1);
            break;
        case 'G': 
            printf("gatunek -> %s", p + 1);
            break;
        };
    }
}

Przetestuj go (nic nie zmieniaj!) i odpowiedz na pytanie, które zadałem wcześniej.

komentarz 2 czerwca 2017 przez AndekQR Użytkownik (880 p.)
1 -> polska
 (rok: 1111 stan: 0 przesl: 1)
artysta -> :polak
artysta -> :polski
artysta -> :kowal
artysta -> :polski
gatunek -> :pop
gatunek -> :rock
2 -> niemiec
 (rok: 33312 stan: 0 przesl: 1)
artysta -> :jan
artysta -> :kowalski
artysta -> :barbara
artysta -> :nowaki
gatunek -> :pop

Działa.

komentarz 2 czerwca 2017 przez j23 Mędrzec (194,920 p.)

Uff, wybornie.

To teraz przeanalizuj ten kod, linia po linii. Najlepiej z użyciem debuggera. Jak przeanalizujesz i zrozumiesz go, odpowiedz sobie na proste pytanie: jeśli ten kod czyta poprawnie wszystkie rekordy i wszystkie dane w nich zawarte, to czy są tu jeszcze potrzebne dodatkowe wywołania funkcji fgets?

 

komentarz 2 czerwca 2017 przez AndekQR Użytkownik (880 p.)
Tylko Twój kod tylko wyświetla te dane, a ja muszę jedną linie wczytać do nowy_artysta->imię, a linie po tą pierwszą do nowy_artysta->nazwisko. Według mnie może tylko przejść zapisywanie imienia z innym znakiem, a nazwisko z innym. A potem dodanie jeszcze jednego case.
komentarz 2 czerwca 2017 przez j23 Mędrzec (194,920 p.)

Mój kod pokazuje tylko, jak wczytać kolejne dane z pliku, bo z tym był, jak rozumiem, problem. Dałem tam, na potrzeby przykładu, wypisywanie danych na ekran, bo tak najprościej sprawdzić, czy wszystko się poprawnie czyta. Teraz przerób ten kod tak, żeby zamiast wypisywania na ekran dodawał dane do struktury/listy.

BTW, dlaczego imię i nazwisko masz w dwóch liniach, zamiast dać np. tak:

A:Jan;Kowalski
A:John;Doe

?

Podobne pytania

0 głosów
3 odpowiedzi 861 wizyt
0 głosów
1 odpowiedź 308 wizyt
pytanie zadane 19 stycznia 2018 w C i C++ przez foruminfa Początkujący (310 p.)
0 głosów
1 odpowiedź 926 wizyt
pytanie zadane 28 października 2017 w PHP przez smokolisz Mądrala (6,340 p.)

92,551 zapytań

141,400 odpowiedzi

319,531 komentarzy

61,938 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!

...