Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

zapis do pliku binarnie

Ostatnio zmodyfikowano 2011-02-08 21:39
Autor Wiadomość
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.
C/C++
#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 ) ) // wczytywanie pliku1 do stringa
    {
        if( i % 2 == 0 )
             out2.write(( char * ) & bufor, sizeof( bufor ) ); //dzielenie tego, co w stringu na wiersze parzyste i nieparzyste
        else
             out1.write(( char * ) & bufor, sizeof( bufor ) ); //oryginalnie bylo out1<<bufor;
       
        i++;
    }
    in.close();
    in.open( "plik2.txt", ios::binary ); // a tu ponizej bede probowal odczytac to co sie zapisalo w jednym z plikow
    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();
   
    //wynikiem w zapisanym pliku2 jest >o>o>o>o (zamiast o jest prostokat )
    // a wynikiem odcztanego pliku2 jest  R"
}

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
P-27897
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.
P-27898
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()?)
P-27902
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() );
P-27904
Elaine
» 2011-02-06 16:49:48
Jeszcze lepiej:
C/C++
file.write( bufor.data(), bufor.size() );
P-27905
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?
P-27996
pekfos
» 2011-02-08 16:22:32
te krzaczki to chyba ten rozmiar, nie? lepiej jako cstringi zapisywać. to lepsze rozwiązanie.
P-28013
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,
P-28047
« 1 » 2
  Strona 1 z 2 Następna strona