在 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】:

您应该阅读并了解有关文件流和相关输入和输出运算符&lt;&lt;&gt;&gt; 的更多信息。您不能像这行代码那样简单地将字符输入到数组中:

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++ 中为结构读取二进制文件的运行时错误的主要内容,如果未能解决你的问题,请参考以下文章

用于在C中为二叉搜索树分配内存的分段错误

Python Pandas 如何从命令行读取 C++ 结构二进制文件

如何读取和写入非固定长度的结构到二进制文件c++

如何用C或c++写一段代码读取xsd结构生成一个XML文件,现在我有数据文件和XSD文件

使用 c++ 时从二进制文件中读取 int 不正确

从 C++ 中读取文件时动态分配内存给结构