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

[C++] std::wfstream - zapis liczb i wstringów do pliku *.bin

Ostatnio zmodyfikowano 2016-03-17 00:19
Autor Wiadomość
carlosmay
Temat założony przez niniejszego użytkownika
[C++] std::wfstream - zapis liczb i wstringów do pliku *.bin
» 2016-03-16 10:46:32
C/C++
std::wcerr.imbue( std::locale( "Polish_poland.852" ) );
using set = std::set < std::wstring, std::less <>>;
std::wfstream file( L"test.bin", std::ios::in | std::ios::out | std::ios::trunc );
if( file.is_open() ) {
    file.imbue( std::locale( "Polish_poland.852" ) );
    std::wstring wstr = L"Jaśka";
    set slowa( { L"Koleś", L"Jeść" } );
    file.write( wstr.c_str(), wstr.size() + 1 );
    std::size_t rozmiar = slowa.size();
    //file.write((wchar_t*)& rozmiar, sizeof(std::size_t));
    for( const std::wstring & el: slowa )
         file.write( el.c_str(), el.size() + 1 );
   
}
else {
    std::wcerr << L"Wystąpił problem z plikiem" << std::endl;
}
Ustawiona jest polska strona kodowa.
W tej postaci wszystko prawidłowo zapisuje do pliku.
Chcę zapisać do pliku rozmiar kontenera set slowa.
Wystarczy, że odkomentuję ten fragment i w pliku nic się nie pojawia.

Edit: Właśnie dopatrzyłem się braku std::ios::binary.
Zweryfikuję wieczorem, czy tylko w tym problem.
P-146086
j23
» 2016-03-16 14:25:30
Trochę bez sensu. Jeśli plik jest plikiem binarnym, to po kiego grzyba to locale i wfstream? Użyj zwykłego ofstream, otwórz w trybie binarnym (ios::binary), a napisy konwertuj do utf-8. Coś w ten deseń:
C/C++
std::wstring_convert < std::codecvt_utf8_utf16 < wchar_t > > converter;
using set = std::set < std::wstring, std::less <>>;

std::ofstream file( "test.bin", std::ios::binary | std::ios::trunc );
if( file.is_open() ) {
   
    std::wstring wstr = L"Jaśka";
    set slowa( { L"Koleś", L"Jeść" } );
   
   
    std::string u8s = converter.to_bytes( wstr );
    file.write( u8s.c_str(), u8s.size() + 1 );
   
    std::size_t rozmiar = slowa.size();
    file.write(( char * ) & rozmiar, sizeof( std::size_t ) );
   
    for( const std::wstring & el: slowa )
    {
        u8s = converter.to_bytes( el );
        file.write( u8s.c_str(), u8s.size() + 1 );
    }
}
P-146088
carlosmay
Temat założony przez niniejszego użytkownika
» 2016-03-17 00:19:03
Jeśli plik jest plikiem binarnym, to po kiego grzyba to locale i wfstream?
Tak mi się wydawało najprościej.

Dzięki temu upieczone dwie pieczenie.
Dzięki Dżej.
P-146117
« 1 »
  Strona 1 z 1