读取二进制文件 (is_open)

reading binary file (is_open)

我试图读取位于所需位置的二进制文件。 实际上,我正在尝试从中读取 class 并将数据放入列表中,为此我创建了一个函数。 这是该函数的主体。

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;
}

虽然整个过程成功但执行了错误消息并且函数returns数据到列表中!!!

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

你需要改变这个:

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() returns 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 class 的实际声明方式,您没有展示。很多时候,像这样阅读整个 classes 是不安全的。您正在尝试将 std::string 对象存储在 std::list 中,因此除非 Elements::item1 成员是固定大小的 char[] 数组,否则您对 read() 的使用可能没有按预期工作。