Запись и чтение бинарного файла (C++)
Нужно записывать в файл информацию о машинах, и иметь возможность этот файл дополнить и прочитать определенное количество записей. При чтении из бинарного файла выводится следующее:
Automobile 1�犎�
Brand: dasf0�t�UMileage: asdf芎�
Price: asdf 芎�
Automobile 2�犎�Brand: afdsfdas0�t�U`�t�UMileage: dafs芎�
Price: fdas
(Прошу прощения за бессмысленный набор букв в значениях полей). Я так понимаю, как-то неправильно интерпретируется эскейп последовательность перехода на новую строку. Для записи использую вот такую функцию:
void binary_write(std::ofstream& ofs, std::string& s){
ofs.write((char*)&s, sizeof(s));
}
Вот строки, которые пишу:
first_line = "Automobile " + std::to_string(count+1);
brand = "Brand: " + brand;
manufacture = "Manufacture: " + manufacture;
release = "Year of release: " + release;
mileage = "Mileage: " + mileage;
price = "Price: " + price;
Код чтения:
while(ifs.read(&temp, sizeof(char)))
std::cout << temp;
Может кто-нибудь подсказать, как корректно организовать ввод-вывод используя бинарные файлы? Заранее спасибо.
Ответы (1 шт):
Если Вы посмотрите на размер sizeof(std::string), то обнаружите, что он или 24, или 32 (в зависимости от версии компилятора, но не длины строки). А все потому, что string - это на самом деле класс, который хранит размер, указатель и емкость. Но если строка маленькая (обычно это символов 15), то данные хранятся прям внутри (именно поэтому Вы и видите какие то строки).
Как правильно писать строки? есть два способа. Первый - писать, ограничив нулевым символом. Это просто.
void binary_write(std::ofstream& ofs, std::string& s){
ofs.write(s.c_str(), s.length()+1);
}
(тут выглядит как будто есть выход за границы, но его нет).
А вот с чтением такого чуточку сложнее - придется читать по символьно, пока ноль не найдется.
Второй способ - вначале писать размер строки, а потом саму строку. Понятно, что при чтении можно длину прочитать и выделить буфер нужного размера + прочитать эту самую строку.
Вот например, посмотрите на этот ответ Запись и чтение объекта из бинарного файла