Problem z wybieraniem bloku danych z pliku

0

Witam, mam problem z wybieraniem bloku danych z pliku. Mam program, który pobiera od użytkownika date urodzenia (miesiac i dzien) i w zaleznosci od miesiaca powinien wybierac z pliku "horoskop.txt" horoskop na dany miesiąc. Dane w pliku są zapisane w następujący sposób:

 
Styczen
...
Luty
...
itd

Nie wiem jak pobrac z pliku blok danych w zaleznosci od podanego przez uzytkownika miesiaca. Oto mój kod:

 
#include<iostream>
#include<fstream>

using namespace std;

int main()
{
    fstream plik;
    string dane;
    char miesiac1, miesiac2, miesiac3;
    int dzien;
    plik.open("horoskop.txt", ios::in);
    cout << "Podaj dzien urodzenia...\n" ;
    cin >> dzien;
    cout << "Podaj pierwsze 3 litery miesiaca urodzenia...\n" ;
    cin >> miesiac1 >> miesiac2 >> miesiac3;
  //
    system("pause");
    return 0;
}
0

Poprawne wczytywanie danych z takiego pliku zajmie bardzo dużo kodu.
Nie mówiąc o tym że i tak tego nie da się poprawnie odczytać (wewnątrz horoskopu na luty może pojawić się słowo marzec).
Rozważ zapisanie tego w 12-tu plikach.

0

@Dragon - nie przesadzaj z tą ilością kodu...
@Patryk - przesadzasz w drugą stronę - wolałbym utworzyć 40 plików niż zmarnować 200 linijek kodu.

@Autor - zakładając że sobie już jakoś poskładasz ten miesiąc i masz w zmiennej miesiac pełną nazwę miesiąca:

Pseudokod:

plik f = otworz(sciezka);
while( ! koniec_pliku(f))
    line = getline(f);
    if (line == miesiac)
    while(true)
        line = getline(f);
        if (line == "") return horoskop; // A raczej if(line == "\n") - zależy jak wczytasz te dane. Dla getline zależy to od parametru delimit. Zakładamy  że pusta linia kończy horoskop. Możesz równie dobrze na koniec horoskopu wrzucać cokolwiek innego, np. `##KONIEC##` etc, etc byle by to był jedyny wyraz w linii
        horoskop += line;
0

MSM, oto plik z horoskopami:

Styczeń
ble ble
a najlepszym miesiącem dla ciebie jest miesiąc
Maj

Luty
...
...

A teraz szukamy horoskop na Maj

0

No to może cos takiego:

[msc_styczen]
.....
[msc_luty]
.......

lub inny wydziwas który jednoznacznie pozwoli określić szukany miesiąc...

0

@13th - wiem że istnieje taka możliwość. Problem w tym że nie da się stworzyć bezkontekstowego formatu tekstowego pozwalającego na zabezpieczenie się przed czymś takim. [msc_czerwiec] również może być wprowadzony w horoskopie. Albo pójdźmy dalej, w pliku może być %&*#(*()CZ3RV13C*@#*(_)).
Ale jaka jest na to szansa? Podany przez Ciebie (@_13th) przykład jest niezbyt prawdopodobny i niezgodny z gramatyką (brak kropki na końcu). Użytkownicy i tak znajdą sposób na wywalenie programu, nie ma co z nimi walczyć ;)

Można z tym walczyć na kilka sposobów -
0 - (zero, bo to żaden sposób jak już pisałem - lepiej już zostawić jak jest) - maksymalne komplikowanie nazw miesięcy
1 - przeprowadzanie walidacji pliku (sprawdzanie poprawności, np. czy nie duplikują się nazwy miesięcy)
2- porzucenie prostego bezkontekstowego formatu i przerzucenie się np. na coś takiego: (starałem się wymyślić coś jak najbardziej czytelnego dla człowieka i jak najmniej zmienić oryginalny format)

Styczeń
3
bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla 
bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
bla bla bla bla bla bla bla bla bla bla bla bla bla bla 
Luty
2
bla bla bla bla bla bla bla bla bla bla 
bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla 

Czyli format Miesiąc - Ilość linijek tekstu. Wadą jest w sporym stopniu utrudnienie edytowania pliku przez człowieka w 'czystej' formie (trzeba pamiętać o lizeniu linii), ale nie wyklucza.

Hope it helps.

1 użytkowników online, w tym zalogowanych: 0, gości: 1