Sortowanie po cenie ze struktury.
Ostatnio zmodyfikowano 2013-02-07 13:24
tomipnh Temat założony przez niniejszego użytkownika |
Sortowanie po cenie ze struktury. » 2013-02-06 23:25:37 staram się wyświetlić wartości ze struktury w kolejności od największej cenowo do najmniejszej. Jednak mam głupi problem z przeniesieniem jednej liczby do drugiej. void pocenie() { ksiega inwentarz; float max, lastMax = 9999; fstream plik( "kinwentarzowa.dat", ios::binary | ios::in ); for(;; ) { plik.read( reinterpret_cast < char *>( & inwentarz ), sizeof( inwentarz ) ); max = 0; if( lastMax == inwentarz.cena ) { cout << "Numer inwentarzowy: " << inwentarz.nrinw << endl; cout << "Nazwa towaru: " << inwentarz.nazwa << endl; cout << "Rodzaj: " << inwentarz.rodzaj << endl; cout << "Ilosc: " << inwentarz.ilosc << endl; cout << "Cena: " << inwentarz.cena << endl; cout << "Dostawca: " << inwentarz.dostawca << endl; cout << "Data przyjecia: " << inwentarz.data << endl; cout << endl << "---------------------------------------------------" << endl; } if(( inwentarz.cena < lastMax ) &&( inwentarz.cena > max ) ) { cout << "przypisalem max"; max = inwentarz.cena; } if( plik.eof() ) { cout << "cykl"; lastMax = max; } if( lastMax = 0 ) { cout << "koniec"; break; } } getch(); system( "cls" ); }
Zasadniczo chcialem zrobic proste sortowanie, zdaje sobie sprawę że to potwornie nie optymalne i brzydkie, ale takie miałem wymagania. Wszystko byłoby fajnie gdyby nie to, że na plik.eof() staje i dostaje spam 'cykli' zamiast zmienic wartosc i ruszyć dalej. Jak inaczej sprawdzić czy cykl miał miejsce bez większego utrudniania kodu? |
|
jsc |
» 2013-02-06 23:28:54 Zazwyczaj sizeof sprawdza się pętli while lub do-while |
|
tomipnh Temat założony przez niniejszego użytkownika |
» 2013-02-06 23:58:38 próbowałem z przenosić się na początek pliku ale to nic nie daje, nadal mam spam |
|
krzyk |
» 2013-02-07 09:36:03 Jeśli inwentarz.nazwa to string a przypuszczam że jest to sizeof niezwróci jego długości.
std::string a; std::cout << sizeof( a ) << std::endl; a = "bardzo długi tekst"; std::cout << sizeof( a ) << std::endl;
Musisz "ręcznie" pobierać każdy element z pliku lub użyć char nazwa[ dlugosc ]; |
|
tomipnh Temat założony przez niniejszego użytkownika |
» 2013-02-07 12:26:33 mi chodzi o samo przeniesienie się do początku pliku, do ponownego przemielenia pliku albo zainicjowanie ponownego cyklu, po całym pliku.
Próbowalem seekg do początku pliku robić ale nadal stoje z zamazanym ekranem, continue też mi nic nie dało. Identyczny sposób na tablicach działał, na strukturze stoi. Cholera mnie trafia, nie mogę wczytać tego do tablicy i tam sobie posortować, muszę robić wszystko na pliku.
W związku z tym chciałem przemielić plik, znajdując max, którego potem przypisuje dla lastMax i miele ponownie cały plik do znalezenia kolejnego max ale mniejszego od lastMax tak by wyświetlić całość sortując po cenie. Ale przypisanie wartości z max do lastMax musi się odbywać po przejechaniu pętlą po całym pliku, przed przeczytaniem 1 wartości ponownie. |
|
krzyk |
» 2013-02-07 12:54:48 eof sprawdzaj zaraz po read bo teraz operujesz na danych które nie zostały odczytane.
plik.read( reinterpret_cast < char *>( & inwentarz ), sizeof( inwentarz ) ); if( plik.eof() ) { plik.clear(); plik.seekg( 0 ); continue; } |
|
tomipnh Temat założony przez niniejszego użytkownika |
» 2013-02-07 13:24:02 To bez znaczenia czy tego ifa mam na początku czy to mój 3ci if, dla każdego zakręcenia pętli sprawdzane są wszystkie warunki. przestawiłem linie if( plik.eof() ) { cout << "zakonczylem cykl"; plik.clear(); plik.seekg( 0, ios::beg ); lastMax = max; continue; } na początek Nadal jednak dostaje nieskończoną ilość zakonczylem cykl ---- Jak zwykle pierdoła, zasadniczo winą była zmiana maxa przy każdym ruchu pętli, przypisując 0 do maxa wewnatrz warunku na eofa wszystko działa. |
|
« 1 » |