чтение двоичного файла (is_open) - PullRequest
0 голосов
/ 24 февраля 2020

Я пытался прочитать двоичный файл, который находится в нужном месте. На самом деле, я пытаюсь прочитать класс из него и поместить данные в список, я создал функцию для этой цели. Вот тело этой функции.

list <string> getlist() {
    list <string> menu;

    string name = "test.bin";

    ifstream infile;

    infile.open((char*)(&name), ios::binary);

    if (!infile.is_open())
        cout << "error1"; // brinting error 

    Elements elements = {};

    infile.read((char*)&elements, sizeof(Elements));

    for (int i = 0; i < 3; i++) {
        menu.push_back(elements.item1);
    }

    infile.close();

    return menu;
}

Сообщение об ошибке выполнено, хотя весь процесс завершается успешно, и функция возвращает данные в список !!!

 if (!infile.is_open())
        cout << "error" << endl; // brinting error 

1 Ответ

0 голосов
/ 24 февраля 2020

Вам необходимо изменить это:

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(), скорее всего, будет работать не так, как предполагалось.

...