Вам необходимо изменить это:
infile.open((char*)(&name), ios::binary);
Вместо этого:
infile.open(name.c_str(), ios::binary);
Приведение типа адреса объекта std::string
не даст вам действительный указатель на символьные данные строки. Для этого и предназначен метод c_str()
(и data()
) строки.
Если вы используете компилятор C ++ 11 или новее, вам даже не нужен прямой доступ к символьным данным. , поскольку open()
имеет перегрузку, которая принимает std::string
в качестве входных данных:
infile.open(name, ios::binary);
В любом случае, если is_open()
возвращает false, НЕ СЛЕДУЕТ переходить к вызову read()
впоследствии. Содержимое elements
будет недействительным. Вы не проверяете эту возможность, например:
if (!infile.is_open())
{
cout << "error opening the file";
return menu; // <-- ADD THIS!
// or better, 'throw' an exception instead...
}
if (!infile.read((char*)&elements, sizeof(Elements))) // <-- ADD FAILURE CHECK!
{
cout << "error reading from the file";
return menu; // <-- ADD THIS!
// or better, 'throw' an exception instead...
}
...
Кроме того, использование infile.read()
сомнительно, в зависимости от того, как фактически объявлен класс Elements
, который вы не показывали. Чаще всего читать такие классы небезопасно. Вы пытаетесь сохранить объекты std::string
в std::list
, поэтому, если элемент Elements::item1
не является массивом char[]
фиксированного размера, использование read()
, скорее всего, будет работать не так, как предполагалось.