0

我正在尝试使用此代码打开二进制数据库

Store::Store(const char* filename)
{
ifstream inFile;
inFile.open(filename, ios::in | ios::binary);
if(!inFile){
    cout << "Could not open file " << data << "!" << endl;
}

while( inFile ){
inFile.read((char*) this, sizeof(Store));
}

inFile.close();

我得到的错误是“无法打开文件”错误,我很困惑。

4

2 回答 2

4

首先,data应该是filename

最可能的原因是您的应用程序的工作目录不在您认为的位置,并且该文件不存在。尝试使用绝对路径来检查是否是这种情况。

与问题无关:这种“保存”对象的方式非常不安全,并且高度依赖于编译器Store在内存中排列实例的方式。保存的存储很可能与使用其他编译器编译的程序版本不兼容,甚至可能与来自同一编译器的不同版本不兼容。

如果Store有虚拟会员,你几乎肯定会崩溃。从技术上讲,无论如何它都是未定义的行为。

您应该考虑序列化的不是整个对象,而是数据库的原始数据部分。看看boost.serialization可能会有所帮助。

于 2013-09-26T17:50:50.163 回答
2

您的代码对于访问文件来说似乎是正确的,我会确保文件路径是正确的,特别是如果它是相对路径。您可能在错误的工作目录中。此外,您可能不具备读取文件的所需权限,请尝试以 admin/root 权限运行(读取文件通常不是这种情况,但值得一提)。

我会打印出工作目录和文件名,以确保所有内容都被正确引用。

于 2013-09-26T17:50:28.727 回答