@KiringD

Как правильно считать значение из бинарного файла C++?

Задача проста, записать длину строки в бинарный файл, а сразу за ней саму строку (и так повторить сколько нужно раз).
Проблема в том, что сами данные записываются в файл верно (скриншот)640a6fb73ba3c095760580.png
Но вот при считывании происходят искажения в конце каждой из строк, хотя их длинна считывается верно.
640a703a27956679835379.png
Если кто то знает решение этой проблемы, очень надеюсь на вашу помощь)
Код для воспроизведения:
#include <iostream>
#include <fstream>

using namespace std;

int main(){
    ofstream fs("1.bin", ios::binary);

    string first = "right_text" ;
    string second = "test_text";

    int size1 = first.length();
    fs.write((char *) &size1, sizeof(int));
    fs.write(first.c_str(), size1);

    int size2 = second.length();
    fs.write((char *) &size2, sizeof(int));
    fs.write(second.c_str(), size2);

    fs.close();

    ifstream is("1.bin", ios::binary);

    int size3, size4;

    string third;
    string fourth;

    is.read((char *) &size3, sizeof(int));

    char buffer1[size3];
    is.read(buffer1, size3);

    is.read((char *) &size4, sizeof(int));

    char buffer2[size4];
    is.read(buffer2, size4);

    is.close();

    third = string(buffer1);
    fourth = string(buffer2);

    cout << size1 << " " << size2 << " " << size3 << " " << size4 << " " << endl;

    cout << third << " " << fourth << endl;

    return 0;
}
  • Вопрос задан
  • 928 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
third = string(buffer1);
fourth = string(buffer2);

Должно быть
third = string(buffer1, size3);
fourth = string(buffer2, size4);

поскольку строки прочитанные в buffer1 и buffer2 не 0-терминированные.

И отдельно
char buffer1[size3];

char buffer2[size4];

это не по стандарту С++, компилируется и работает только из-за расширений GNU.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы