• 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
96 wizyt
pytanie zadane 2 czerwca 2017 w C i C++ przez AndekQR Użytkownik (760 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 (58,100 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 (58,100 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 (760 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 (58,100 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 (760 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 (58,100 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ź 108 wizyt
0 głosów
1 odpowiedź 88 wizyt
pytanie zadane 19 stycznia w C i C++ przez foruminfa Początkujący (310 p.)
+1 głos
2 odpowiedzi 62 wizyt
pytanie zadane 29 stycznia 2017 w C i C++ przez czujek22 Mądrala (5,920 p.)
Oferty pracy dla początkujących programistów na portalu No Fluff Jobs
Porady nie od parady
Możesz ukryć, zamknąć lub zmodyfikować swoje pytanie, za pomocą przycisków znajdujących się pod nim. Nie krępuj się poprawić pochopnie opublikowanego pytania czy zamknąć go po uzyskaniu satysfakcjonującej odpowiedzi. Umożliwi to zachowanie porządku na forum.Przyciski pytania

49,742 zapytań

91,700 odpowiedzi

185,224 komentarzy

24,203 pasjonatów

Przeglądających: 242
Pasjonatów: 17 Gości: 225

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.

...