driver1995 Temat założony przez niniejszego użytkownika |
Zapisywanie danych z pliku... » 2009-10-15 12:50:01 Witam... Kiedyś napisałem temat ( http://forum.ddt.pl/?Tid=1013) o odczytywaniu danych z pliku... I zgodnie z przykładem, jaki mi tam zaproponowano, chciałbym teraz np. zmienić te dane i zapisać nowe, nie zmieniają przy tym innych... Kod wygląda mniej więcej tak (do odczytywania): #include <iostream> #include <fstream> #include <string> #include <vector> #include <iterator> #include <algorithm>
using namespace std;
struct item { string nazwa; double cena; unsigned int ilosc; };
istream & operator >>( istream & str, item & obj ) { str >> obj.nazwa >> obj.cena >> obj.ilosc; return str; }
ostream & operator <<( ostream & str, const item & obj ) { str << obj.nazwa << "\t" << obj.cena << "\t" << obj.ilosc << "\t"; return str; }
int main() { ifstream plik( "a.txt" ); if( plik.fail() ) { cerr << "zuo przyszlo i otworzyc nie dalo..."; return - 1; } vector < item > rzeczy; item temp; copy( istream_iterator < item >( plik ), istream_iterator < item >(), back_inserter( rzeczy ) ); copy( rzeczy.begin(), rzeczy.end(), ostream_iterator < item >( cout, "\n" ) ); } |
|
DejaVu |
» 2009-10-15 13:26:36 To wogóle działa...? :) nie jestem pewien czy std::string'a możesz sobie zapisać do pamięci w ten sposób. Jeśli łańcuch znaków jest dynamiczny to będziesz musiał zmienić wszystkie dane. Jeśli byłby to stały rozmiar struktury, tj. struct bleble { char napis[ 20 ]; double liczba; int costam; };
Mógłbyś ustalać numer elementu w pliku tak: int iRozmiar = sizeof( bleble ); int iPozycjaStartowa = indeks * iRozmiar;
Następnie wykonałbyś przesunięcie na iPozycjaStartowa' w pliku i zapisał iRozmiar' bajtów. |
|
driver1995 Temat założony przez niniejszego użytkownika |
» 2009-10-15 13:28:06 No pewnie... A czemu ma nie działać :) |
|
DejaVu |
» 2009-10-15 13:37:38 Wydaje mi się, że program, który przedstawiłeś zapisuje dane tekstowo, a nie binarnie, tak więc nie ma opcji wczytywania wybranego elementu i jego zapisywania. Kod ten pisał manfred, więc te szlaczki on najlepiej pojmuje :) Ja nie znam na tyle dobrze STL'a, żeby powiedzieć co dokładnie ten kod robi. Mogę się jedynie domyślać lub go po prostu skompilować (ale nie chce mi się ;p). |
|
driver1995 Temat założony przez niniejszego użytkownika |
» 2009-10-15 14:19:35 ok... spróbuję tego sposobu, tylko jeszcze mam pytanie... Jak mam np. char napis[20]; i chcę zmienić ten napis na co innego, to jak to zrobić... Bo jak robię np. napis="blebleble" to nie wychodzi???
Edit: Ale tego tego czegoś, co mi podałeś to nie rozumiem :/ Czym jest ten indeks i jak to zapisać.. Bo plik<<costam nie chce działać.. A jak robię write() to mi wyskakują błędy... |
|
Elaine |
» 2009-10-15 15:02:00 char foo[ 20 ]; strcpy( foo, "Ala zjadła kota." ); Kod ten pisał manfred, więc te szlaczki on najlepiej pojmuje |
Zaraz szlaczki. To jest całkiem normalny kod C++, który nie używa niczego niezwykłego. Ale jedno muszę przyznać - autor musi być maniakiem STLa i standardofilem, żeby coś takiego zrobić, przecież zwykła pętla zrobi to samo, a jest kapkę czytelniejsza. Hmmm... Jeśli chcesz użyć tego cyrku manfreda (@ten zuy, jeśli to czytasz: srx, nie jestem takim do końca nowym userem, pamiętam tamte czasy i wiem, jaki miałeś nick), to wyglądałoby to jakoś tak: 1. Dodanie nowego przedmiotu: item foo; foo.nazwa = "Banan"; foo.cena = 4.20; foo.ilosc = 11; rzeczy.push_back( foo ); 2. Zmiana istniejącego: int i = 8; rzeczy[ i ].nazwa = "Gruszka";
3. Zapisanie tego do pliku:
ofstream file( "sth.txt" ); if( file.fail() ) { }
#if 0 for( size_t i = 0; i < rzeczy.size(); ++i ) { file << rzeczy[ i ] << '\n'; } #else copy( rzeczy.begin(), rzeczy.end(), ostream_iterator < item >( file, "\n" ) ); #endif
|
|
driver1995 Temat założony przez niniejszego użytkownika |
» 2009-10-15 18:52:09 Dzięki wielkie za pomoc... A jeszcze mam takie pytanie... Czemu sądzicie, że kod manfreda jest nieczytelny?? Co jest w nim nie tak? I jak jest prościej? :) |
|
DejaVu |
» 2009-10-15 19:21:45 copy( istream_iterator < item >( plik ), istream_iterator < item >(), back_inserter( rzeczy ) ); Czy powyższa linijka jest dla Ciebie oczywista? :) Jeśli tak to gratuluję tak dobrej znajomości STL'a :) Ja nigdy nie używałem szablonu istream_iterator i back_inserter'a. |
|
« 1 » 2 |