在 C++ 中为结构读取二进制文件的运行时错误
Posted
技术标签:
【中文标题】在 C++ 中为结构读取二进制文件的运行时错误【英文标题】:Run-Time Error for reading a binary file in C++ for a struct 【发布时间】:2013-10-21 17:47:41 【问题描述】:我一直在尝试从 C++ 中的二进制文件中读取数据,但出现运行时错误,程序已停止工作!
我以前使用过类似的代码,它仍然有效。我在执行类 SettingsClass 的构造函数时遇到错误 [可能是因为 read 函数,因为删除它后,一切都运行良好。]
struct Setting
int SettingID;
int SettingINTValue;
double SettingDOUBLEValue;
char SettingCHARValue;
string SettingSTRINGValue;
string SettingName;
;
class SettingsClass
public:
void ResetSettings()
fstream SettingFile;
Setting defaultsetting[NoOfSettings];
for(int i=1;i<=NoOfSettings;i++)
defaultsetting[i-1].SettingID = i;
defaultsetting[i-1].SettingINTValue = 0;
defaultsetting[i-1].SettingDOUBLEValue = 0.0;
defaultsetting[i-1].SettingCHARValue = '#';
defaultsetting[i-1].SettingSTRINGValue = "null";
switch(i)
default:
defaultsetting[i-1].SettingName = "Compression Levels";
defaultsetting[i-1].SettingSTRINGValue = "Normal";
defaultsetting[i-1].SettingINTValue = 1;
break;
cout<<i<<". "<<defaultsetting[i-1].SettingName<<"\n\t "<<defaultsetting[i-1].SettingINTValue<<"\n\t "<<defaultsetting[i-1].SettingDOUBLEValue<<"\n\t "<<defaultsetting[i-1].SettingCHARValue<<"\n\t "<<defaultsetting[i-1].SettingSTRINGValue<<"\n\t ";
cout<<"\n";
SettingFile.open(SettingsFilePath,ios::binary|ios::out);
if(SettingFile.is_open())
SettingFile.write(reinterpret_cast<char const *>(&defaultsetting),sizeof(defaultsetting));
else
cout<<"Error!";
SettingFile.close();
SettingsClass()
fstream SettingFile;
SettingFile.open(SettingsFilePath,ios::binary|ios::in);
if(SettingFile.is_open())
Setting TempSettings[NoOfSettings];
SettingFile.read((char*)&TempSettings,sizeof(TempSettings));
else
cout<<"Error...";
SettingFile.close();
Settings;
【问题讨论】:
请缩进你的代码 您不能将std::string
读写到这样的文件并期望它能够正常工作。你需要正确序列化。
【参考方案1】:
您应该阅读并了解有关文件流和相关输入和输出运算符<<
和>>
的更多信息。您不能像这行代码那样简单地将字符输入到数组中:
SettingFile.read((char*)&TempSettings,sizeof(TempSettings));
该数组不是char
的,但您将其转换为这样。相反,您应该遍历可用的输入并填写数组,例如:
for(size_t i = 0; i<NoSetting; ++i)
SettingFile >> TempSettings[i];
当然你应该重载适当的输入操作符:
istream& operator>>(istream& _is, Setting& _s)
//read all variables of setting, i.e.:
//_is >> _s.var1;
//_is >> _s.var2;
//etc.
您的输出可能有相同的错误。你应该超载:
ostream& operator<<(ostream& _os, const Setting& _s)
//output all variables of Setting, e.g.:
//_os << _s.var1;
做这样的事情而不是文件流write
:
for(size_t i = 0; i<NoSetting; ++i)
SettingsFile << defaultSetting[i];
【讨论】:
老兄,我做了和你说的一模一样的事情——首先重载然后使用它,但它有助于消除运行时错误,但我的文件中仍然没有数据! ? 您应该针对文件中未显示的数据开始一个新问题。但是网上有很多这样的例子,一定要严格遵守。还可以尝试使用 ostream 和 istream 练习一个较小的程序。这将为您提供更多经验,以便能够在更大的项目中实施它们。 哦,对不起,它工作正常,我只是使用了错误的运算符!无论如何,谢谢。 嘿,但是检索数据部分有问题,我得到了垃圾值!请帮帮我。 我现在再次推荐一个单独的问题,因为它略有不同。并记住发布一个不起作用的最小示例。以上是关于在 C++ 中为结构读取二进制文件的运行时错误的主要内容,如果未能解决你的问题,请参考以下文章
Python Pandas 如何从命令行读取 C++ 结构二进制文件