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

Odczyt danych z pliku

Konferencja JOIN! 2018
0 głosów
102 wizyt
pytanie zadane 2 czerwca 2017 w C i C++ przez AndekQR Użytkownik (780 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 Maniak (71,040 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 Maniak (71,040 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 (780 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 Maniak (71,040 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 (780 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 Maniak (71,040 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ź 125 wizyt
0 głosów
3 odpowiedzi 110 wizyt
0 głosów
1 odpowiedź 93 wizyt
pytanie zadane 19 stycznia w C i C++ przez foruminfa Początkujący (310 p.)
Porady nie od parady
Publikując kody źródłowe korzystaj ze specjalnego bloczku koloryzującego składnię (przycisk z napisem code w edytorze). Nie zapomnij o ustawieniu odpowiedniego języka z rozwijanego menu oraz czytelnym formatowaniu kodu.Przycisk code

55,269 zapytań

99,579 odpowiedzi

204,902 komentarzy

27,241 pasjonatów

Przeglądających: 136
Pasjonatów: 1 Gości: 135

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.

...