WideString zapis i odczyt z pliku

0

Witam

Mam problem z odczytem WideString'a z pliku. Przy zapisywaniu jest ok ale po odczytaniu zatrzymuje mi się na znaku 0 (NULL) biorąc to jako znak końca tekstu. Gdy otworze plik w hex edytorze wygląda on mniej więcej tak J0a0k0i0 itd.. Jak powinnam to teraz odczytać?

Programuje w C++Builder personal

WideString s = "Jakiś tekst";
int len =  (s.Length()*sizeof(wchar_t));
FILE *f = fopen( "cos.txt", "wb+" );
fwrite( (char*)&len, sizeof(int), 1, f );
fwrite( (char*)s.c_bstr(), len, 1, f );
fclose(f);

dodanie znacznika <code class="cpp"> - Furious Programming

0

Trzymając się C, odczyt powinien wyglądać tak (bez obsługi błędów):

FILE *in;
int len;
wchar_t* buf;

in = fopen( "cos.txt", "rb");
fread(&len, sizeof(int), 1, in);
buf = (wchar_t*)malloc(len * sizeof(wchar_t));    
fread( buf, sizeof(wchar_t), len, in);
//tu robisz coś z odczytanym łancuchem np. WideString ws(buf);
free(buf);   
fclose(in); 

Niestety zapis do pliku nie jest bez wad.
Zmienna len powinna określać długość łańcucha w znakach a nie bajtach:

int len =  (s.Length() + 1;// + 1 na znak końca łańcucha 

Dla pierwszego argument funkcji fwrite() nie jest potrzebne dodatkowe rzutowanie (wskaźnik może być dowolnego typu):

fwrite( &len, sizeof(int), 1, f ); 

Drugi argument funkcja fwrite() oczekuje rozmiaru typu a nie liczby elementów (czyli tak jak zrobiłaś wcześniej); liczbę elementów przekazujesz w trzecim:

fwrite( s.c_bstr(), sizeof(wchar_t), len, f ); 

A teraz dla porównania zapis i odczyt z użyciem biblioteki VCL:

WideString s = "Jakiś tekst";
TFileStream* fs = new TFileStream("cos.txt", fmCreate);
int len =  s.Length() + 1;
fs->Write(&len, sizeof(int));
fs->Write(s.c_bstr(), len);
delete fs;

TFileStream* fs = new TFileStream("cos.txt", fmOpenRead);
int len;    
fs->Read(&len, sizeof(int));
wchar_t* buf = new wchar_t[len];
fs->Read(buf, len);
//tu robisz coś z odczytanym łancuchem np. WideString ws(buf);
delete[] buf;
delete fs; 
0

Witam

Przy delete buf wyskakuje w CodeGuard Resource type mismatch... dlaczego?

0

Nie wiem. Może to kwestia konfiguracji. To co podałem powinno się kompilować. A walidacja...

0

Tak wiem, właśnie ciągle problem mam z tym delete.. Tak czy inaczej dziękuje

0

Chyba powinno byc delete [] buf zamiast delete buf, wtedy jest ok..

0

No pewnie! Takie przeoczenie. Mea culpa.

Już poprawiłem.

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