读取二进制文件 (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()
的使用可能没有按预期工作。
我试图读取位于所需位置的二进制文件。 实际上,我正在尝试从中读取 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()
的使用可能没有按预期工作。