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

Odczyt danych z pliku

0 głosów
116 wizyt
pytanie zadane 2 czerwca 2017 w C i C++ przez AndekQR Użytkownik (860 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 Szeryf (84,880 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 Szeryf (84,880 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 (860 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 Szeryf (84,880 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 (860 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 Szeryf (84,880 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
1 odpowiedź 144 wizyt
0 głosów
3 odpowiedzi 122 wizyt
0 głosów
1 odpowiedź 97 wizyt
pytanie zadane 19 stycznia 2018 w C i C++ przez foruminfa Początkujący (310 p.)
Porady nie od parady
Wynikowy wygląd pytania, odpowiedzi czy komentarza, różni się od tego zaprezentowanego w edytorze postów. Stosuj więc funkcję Podgląd posta znajdującą się pod edytorem, aby upewnić się, czy na pewno ostateczny rezultat ci odpowiada.Podgląd posta

59,149 zapytań

104,559 odpowiedzi

216,353 komentarzy

31,538 pasjonatów

Przeglądających: 296
Pasjonatów: 10 Gości: 286

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...