Odczyt z pliku błędy

0

Witam zaczne od tego że mam obsługiwać listę podwieszaną która jest najpierw zapisana w pliku txt .Zrobiłem,że to ma wyglądać mniej wiecej tak:

nazwaplyty piosenka1 piosenka2 ;
nazwaplyty1 ;
nazwaplyty2 piosenka ;
 bool openfromfile(string name, cd*&head)
{
	ifstream plik;
	plik.open(name);
	if (!plik.is_open())
	{
		return false;
	}
	if (plik.eof())
	{
		return false;
	}
	else {

		string dana;
		while (!plik.eof())
		{
			plik >> dana;
			dodsortcd(head, dana);
			plik >> dana;
			while (dana != ";")
			{
				dodajsorts(head->first, dana);
				plik >> dana;
			}

		}

		return true;
	}
	plik.close();
}

Według mnie to powinno działać tak:Otwieram plik sprawdzam czy sie wgl otworzył jak nie to zwracam false,potem sprawdzam czy Od razu po otworzeniu nie jestme na jego koncu co powinno oznaczać,że jest pusty tak?I potem uzupełniam liste na takiej zasadzie,że pierwszy wyraz to nazwa płyty,sprawdzam czy kolejny to srednik jak nie to kolejne wyrazy to są piosenki.Zakładam,że plik jest poprawnie uzupełniany czyli nie ma np takiej sytuacji,że jest tylko nazwa płyty,a średnika wgl nie ma i teraz mam pare problemów.Jak plik jest pusty to jak np wywołam tą funkcje to po funkcji nawet jak mam

 cout<<"cokolwiek"<<endl;

w mainie to się nic nie wykonuje,nie wiem czemu,jak coś w pliku jest zapisane to kolejne instrukcje w mainie się wykonują.Dodatkowo niekoniecznie dobrze się odczytują te dane bo np jak w pliku tekstowym mam :

plyta1 a b c d  ;
plyta2 a c d k  ;
plyta3 a m k d ;

To w konsoli po wypisaniu wszystkie piosenki ida do plyty1,ale płyty sa poprawnie odczytane czyli sa 3...
Wiem,że ten odczyt jest zły,ale nie mam pojęcia jak go poprawić do tej zasady co podałem,że najpierw jest nazwa płyty potem piosenki aż do znalezienia średnika.Z tym postaram sobie sam poradzić,ale nie wiem dlaczego w 2 pierwszych przypadkach(blad pliku,pusty plik)Nic sie potem nie wywołuje

0
string dana, string a, string b, string c;
        while (plik >> dana >> a >> b >> c)
        {
            // tutaj dodaj cały obiekt do listy
        }

Nie wiadomo też co tam robisz w funkcjach dodsortcd i dodajsorts.

0

Okej poprawiłem odczytywanie teraz został tylko problem,że gdy plik jest pusty to po tej funkcji nic się nie robi.Nie mam pojęcia co jest nie tak...

0
  1. Debugger i do dzieła. Błędy logiki same się nie znajdą.
  2. Żeby pomóc, musimy widzieć kod.
0
 int main()
{
	bool dupli = false;
	string names = "plik.txt";
	cd*head = NULL;
	openfromfile(names, head);
	int wybor;
	bool end = false;
	string nazwa;
	cd*adres;
	string title;
	int nr;
	instrukcja();
	while (!end)
	{
	

To kawałek maina,ale chodzi o to,że teraz nawet funkcja instrukcji sie nie pokazuje która wygląda tak :

 void instrukcja()
{
	cout << "Wcisnij 1 aby dodac plyte" << endl;
	cout << "Wcisnij 2 aby dodac piosenki" << endl;
	cout << "Wcisnij 3 aby wyswietlic liste" << endl;
	cout << "Wcisnij 4 aby usunac plyte" << endl;
	cout << "Wcisnij 5 aby usunac piosenke z płyty" << endl;
	cout << "Wcisnij 6 aby usunac wszystkie piosenki z plyty" << endl;
	cout << "Wcisnij 7 aby zapisac liste do pliku" << endl;
	cout << "Wcisnij 8 aby znalesc wszystkie plyty gdzie znajduje sie dana piosenka" << endl;
}

Ale gdy w pliku znajduje się coś to działa poprawnie.Gdy jest pusty nic się nie pojawia.

0

odpal to pod debuggerem. Masz gdzies blad i Ci zapewne wywala cala aplikacje

albo masz zle zdefiniowana funkcje i myslisz ze to ta, ale to tak na prawde inna

0

Okej już w miare ogarnąłem,potrzebuje tylko sprawdzić czy plik jest pusty znalazłem coś takiego :

 fseek(fileDescriptor, 0, SEEK_END);
 if (ftell(fileDescriptor) == 0) {
     // file is empty...
 } else {
     // file is not empty, go back to the beginning:
     fseek(fileDescriptor, 0, SEEK_SET);
 }

Ale nie wiem co to fileDescriptor i jak to uzupełnić w mojej funkcji.

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