Zapisywanie zmiennych typu UnicodeString w C++ Builder

0

W starszych wersjach C++ Buildera, gdzie typem tekstowym było AnsiString zapisywanie przy użyciu biblioteki fstream było trywialne.

AnsiString zdania[10];

ofstream moj_plik; moj_plik.open("moje_zdania.txt");
for(int i=0;i<10;i++)
{
 moj_plik<<zdania[i].c_str()<<"\n";
}
moj_plik.close();

Jak zastosować taki sam zapis, gdy zamiast starego typu AnsiString używa się nowszego UnicodeString gdzie zamiast działania - <<zmienna_tekstowa.c_str() bedzie działanie <<zmienna_tekstowa.w_str()?
Analogicznie dla fragmentu kodu:

UnicodeString zdania[10];

ofstream moj_plik; moj_plik.open("moje_zdania.txt");
for(int i=0;i<10;i++)
{
 moj_plik<<zdania[i].w_str()<<"\n";
}
moj_plik.close();

kompilacja nastąpi poprawnie, program się uruchomi, tyle że wynikiem będzie plik tekstowy w którego linijkach zamiast oczekiwanego tekstu będą jakiej linijki kodu szesnastkowego.

1

Może zacznijmy, skąd masz ta chorą manierę na niskopoziomowe .c_str()
(ja wiem skąd, ze środowiska borlandowców)

Śmieszne są te C++ typy borlandowe / embecadero, gdzie największą troska jest kompatybilność z Delphi.
Ilość typów około-znakowo-stringowych już w czystym C++ chora, w dialektach poborlandowych idzie w kosmos.

class RTL_DELPHIRETURN UnicodeString
https://docwiki.embarcadero.com/Libraries/Sydney/en/System.UnicodeString

Konkluzja: proponuje pogłębic znajomość z czysta wersją języka, tak jak angielskiego nie będziesz sie uczył w Szikagu

0

Z tego co pamiętam, jak się zrobiło najpierw #include <iostream>, a dopiero potem #include <vcl.h> to wtedy vcl dodawał operator strumieniowy dla TString.
VCL dostarcza swoją obsługę plików, ergo lepiej korzystać z API VCL-a do zapisu plików.

https://docwiki.embarcadero.com/Libraries/Alexandria/en/System.Classes.TStrings.SaveToFile
https://docwiki.embarcadero.com/Libraries/Alexandria/en/System.Classes.TStrings.SaveToStream
https://docwiki.embarcadero.com/Libraries/Alexandria/en/System.Classes.TStream

OFFTOPIC:
zastanawiam się czemu wybrałeś akurat C++Builder?
Zgaduje, że trafiłeś na bardzo popularny wśród początkujących kurs C++ od MZ, który słynie z bardzo wielu poważnych błędów technicznych.

1

Przykłady rozwiazywania problemów UnicodeString ze SO wskazują, że UnicodeString to pewnego rodzaju surówka (przeszczep do niby-C++ idei delphistycznej), którą dopiero trzeba rzutować. Uniwersalnosć tego co w środku siedzi w zamian za skomplikownaie użycia

Uprzedzajac pytanie: nie, nie dam gotowego linka do SO

0

Dzięki, zawsze wiem, że w ostateczności mogę posłużyć wbudowanym w C++ Buildera SaveToFile zadziała zawsze w tym środowisku dla listy TStrings. Może bardziej chciałem "rozgryść" jak typ wchar_t* może być wykorzystany w zapisie z ofstream gdzie jest wymagany standardowo char*. I jakoś nie mogę znaleźć jeszcze rozwiązania.

0

Ostatecznie obeszłem to konwertując wchar_t* do char*. Zapisuje się już jak powinno.

UnicodeString zdania[10];

ofstream moj_plik; moj_plik.open("moje_zdania.txt");
char wyjscia[10][256];
for(int i=0;i<10;i++)
{
 wcstombs(wyjscia[i],zdania[i].w_str(),256;
 moj_plik<<wyjscia[i]<<"\n";
}
moj_plik.close();

Mimo wszystko zakładam, że jest jakiś sposób gdzie typ wchar_t można "streamować" i konwersja do char nie jest wymagana.

1

W kategorii bohaterstwo - pierwsze miejsce

0
UnicodeString zdania[10];

  for(int i=0;i<10;i++)
   zdania[i] = "ąłżóźaaaa";

ofstream moj_plik;
moj_plik.open("moje_zdania.txt");
for(int i=0;i<10;i++)
{
 moj_plik << (AnsiString)zdania[i].c_str() << "\n";
}
moj_plik.close();

@davout mi bez problemu zapisuje i to nawet z polskimi znakami :)

0

Próbowałeś?

moj_plik.imbue(locale(".UTF-8"));
1

Zastanawiam się .... po co?
Po co jakaś dziwna klasa, niestandardowa i obca

...

1 użytkowników online, w tym zalogowanych: 0, gości: 1