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;