pisanie i odczytywanie łańcucha do pliku binarnego C ++


Mam problem z zapisaniem ciągu znaków do pliku binarnego. To jest mój kod:
ofstream outfile("myfile.txt", ofstream::binary);
std::string text = "Text";
outfile.write((char*) &text, sizeof (string));
outfile.close();

Potem próbuję to przeczytać
char* buffer = (char*) malloc(sizeof(string));
ifstream infile("myfile.txt", ifstream::binary);
infile.read(buffer, sizeof (prueba));
std::string* elem = (string*) buffer;
cout << *elem;
infile.close();

Po prostu nie mogę zmusić tego do pracy. Przepraszam, jestem po prostu zdesperowany. Podziękować!
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

linia
outfile.write((char*) &text, sizeof (string));

to nie jest właściwe
sizeof (string)
nie zwraca długości ciągu, zwraca rozmiar typu string w bajtach.
również nie rzutuj tekstu na
char *
używając rzutowania C, możesz uzyskać dostęp do char * używając odpowiedniej funkcji składowej
text.c_str ()
możesz po prostu napisać
outfile << text;

zamiast.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Aby zapisać std :: string do pliku binarnego, musisz najpierw zapisać długość ciągu:
std::string str("whatever");
size_t size=str.size();
outfile.write(&size,sizeof(size);
outfile.write(&str[0],size);

Aby go przeczytać, odwróć proces, najpierw zmieniając rozmiar wiersza, aby mieć wystarczająco dużo miejsca:
std::string str;
size_t size;
infile.read(&size, sizeof(size));
str.resize(size);
infile.read(&str[0], size);

Ponieważ linie mają zmienny rozmiar, jeśli nie zmieścisz tego rozmiaru w pliku, nie będziesz w stanie uzyskać tego dobrze. Możesz polegać na znaczniku „\ 0”, który na pewno znajduje się na końcu ciągu c, lub równoważnym wywołaniu string :: c_str (), ale nie jest to dobry pomysł, ponieważ
1. musisz czytać znak po znaku w ciągu, sprawdzając wartość null
2. a std :: string może legalnie zawierać bajt null (chociaż naprawdę nie powinien, ponieważ wywołania c_str () są wtedy mylące).
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

  • Dlaczego używasz wskaźników do klasy
    std :: string
  • Nie należy używać
    sizeof
    z
    std :: string
    , ponieważ zwraca on rozmiar obiektu
    std :: string
    , a nie rzeczywisty rozmiar sznurka w środku.

Musisz spróbować:
string text = "Text";
outfile.write(text.c_str(), text.size());

lub
outfile << text;
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Prawdopodobnie powinieneś również użyć
c_str ()
, aby uzyskać wskaźnik znaku, zamiast tego zwykłego szalonego rzutowania.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Miałem ten sam problem. Tutaj znalazłem idealną odpowiedź:

napisz plik w formacie binarnym
https://coderoad.ru/43602649/
Kluczowe pytania: użyj string :: length, aby uzyskać długość ciągu podczas pisania, i użyj resize () przed odczytaniem ciągu. Zarówno do czytania, jak i pisania użyj mystring.c_str () zamiast samego ciągu.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Wypróbuj ten fragment kodu.
/* writing string into a binary file */ fstream ifs;
ifs.open ("c:/filename.exe", fstream::binary | fstream::in | fstream::out); if (ifs.is_open())
{
ifs.write("string to binary", strlen("string to binary"));
ifs.close();
}

Tutaj
http://cplus.about.com/od/lear ... 2.htm
dobry przykład.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Twój kod jest nieprawidłowy w niewłaściwy sposób, którego używasz do pisania & amp; czytaj plik
a błąd rozszerzenia pliku, który próbujesz odczytać, poprawny kod to
.txt


Napisz do pliku

std::string text = "Text";
ofstream outfile("myfile.dat", ofstream::binary | ios::out);
outfile.write(&text,sizeof (string));//can take type
outfile.write(&text,sizeof (text));//can take variable name
outfile.close();


odczyt pliku

char* buffer = (char*) malloc(sizeof(string));
ifstream infile("myfile.dat", ifstream::binary | ios::in);
infile.read(buffer, sizeof (prueba));
std::string* elem = (string*) buffer;
cout << *elem;
infile.close();

Wypróbuj ten, zadziała

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się