dmx81 Temat założony przez niniejszego użytkownika |
zapis do pliku binarnie » 2011-02-06 16:09:22 wczesniej nie uzywalem tego sposobu, ale chcialbym sie nauczyc. z tego co poczytalem, doszedlem do wniosku, ze powinno sie rzutowac dane, ktore chce sie zapisac, na typ char* i podac rozmiar danych w bajtach, uzywajac ofstream write. #include <iostream> #include <fstream> #include <string> using namespace std;
int main() { string bufor; ifstream in( "plik1.txt" ); ofstream out1; ofstream out2; out1.open( "plik2.txt", ios::binary ); out2.open( "plik3.txt", ios::binary ); if( !in.is_open() ) cout << "blad otwarcia plik1.txt\n"; if( !out1.is_open() ) cout << "blad otwarcia plik2.txt\n"; if( !out2.is_open() ) cout << "blad otwarcia plik3.txt\n"; int i = 1; while( getline( in, bufor ) ) { if( i % 2 == 0 ) out2.write(( char * ) & bufor, sizeof( bufor ) ); else out1.write(( char * ) & bufor, sizeof( bufor ) ); i++; } in.close(); in.open( "plik2.txt", ios::binary ); in.seekg( 0, ios::end ); int len = in.tellg(); in.seekg( 0, ios::beg ); char str[ len ]; in.read( str, len ); in.close(); cout << str; out1.close(); out2.close(); } czy napisalem to poprawnie? (kod byl pewnego uzytkownika, ktory mial inne problem, ja go przerobilem do zapisu danych binarnie) prosze o poprawienie mnie, gdzie robie bledy i podpowiedz, jak najlepiej zapisywac dane binarnie, dzieki |
|
pekfos |
» 2011-02-06 16:13:03 tak zapisuj liczby, enumy, itp. std::string nie bo zapiszesz tylko wskaźniki a danych nie. tekst zapisuj jako cstringi. |
|
dmx81 Temat założony przez niniejszego użytkownika |
» 2011-02-06 16:41:30 ok smiga, dzieki.
c_str() dopisuje \0 na koniec, a data() nie - o to chodzi? wczesniej uzywalem tez sizeof(string) zamias string.size() (bo myslalem ze sizeof() zwroci mi ilosc bajtow zajmowanych przez string jak w przypadku klasy itp, ale pewnie zwraca rozmiar adresu - a dodatkowe pytanie, czy da sie sprawdzic rozmiar stringa przez sizeof()?) |
|
pekfos |
» 2011-02-06 16:46:14 nie rzutuj wartości .c_str() na char*. wystarczy i powinno być tak: file.write( bufor.c_str(), bufor.size() ); |
|
Elaine |
» 2011-02-06 16:49:48 Jeszcze lepiej: file.write( bufor.data(), bufor.size() );
|
|
dmx81 Temat założony przez niniejszego użytkownika |
» 2011-02-07 22:31:07 kolejne pytanie w tym temacie, a raczej upewnienie sie:
wymyslilem sobie taki sposob zapisu: - sprawdzam rozmiar stringa - zapisuje najpierw jego rozmiar, nastepnie string - odczytujac odczytuje najpierw rozmiar, potem tworze tablice char[rozmiar], a pozniej wczytuje rozmiar*bajtow
tutaj mam pytanie, bo niby wczytywalo sie ok, ale jakies krzaczki pomiedzy napisami sie pojawialy - domyslilem sie, aby zamiast char[rozmiar] tworzyc char[rozmiar+1] i po wczytaniu rozmiar bajtow - dopisac na pozycji[rozmiar] znak '\0', czy tak jest prawidlowo? |
|
pekfos |
» 2011-02-08 16:22:32 te krzaczki to chyba ten rozmiar, nie? lepiej jako cstringi zapisywać. to lepsze rozwiązanie. |
|
dmx81 Temat założony przez niniejszego użytkownika |
» 2011-02-08 19:16:33 no te krzaczki to rozmiar - jak zwiekszylem rozmiar tablicy na wczytywane bajty o 1 i dopisywalem tam '\0' to krzaczki zniknely ;) cstring czyli string? a glowne pytanie w poscie powyzej to takie, czy tak sie robi (jak zrobilem u siebie) ze zapisujac np jakis tekst do pliku - zapisujemy najpierw jego dlugosc ? (jako int rzutowany na char - a pozniej odczytujac ilosc bajtow sizeof(int) - rzutujemy na int)
a drugie, ktore mi sie nasunelo, byc moze powinienem zalozyc nowy watek - pomyslalem, ze teraz to zalaczajac program laduje dane z pliku do programu, ale co bedzie, jak danych bedzie naprawde duzo - chyba bez sensu wtedy zapychac pamiec, skoro i tak jest to na dysku, pewnie trzeba zakodowac to tak, aby do pamieci ladowalo potrzebna ilosc informacji (to bedzie katalog filmow - wiec wiadomo bede wyswietlal ich liste - pewnie trzeba znalezc jakies optymalne rozwiazanie, ile ich naraz trzymac w pamieci, |
|
« 1 » 2 |