C++ 从二进制文件读取结构数据时获取垃圾值

C++ 从二进制文件读取结构数据时获取垃圾值,c++,data-structures,struct,inputstream,garbage,C++,Data Structures,Struct,Inputstream,Garbage,大家好,在我的前一个问题中,我能够获取要加载到文件中的结构的数据,但现在的问题是,我在检索它时获取垃圾值 文件内容:settings.bin 代码 为什么我会得到这些垃圾值?谁能帮帮我,因为我认为它不应该像这样出现(?)。对于结构数组中的每个这样的元素,我应该得到1 提前谢谢 您似乎忘记将设置加载到文件中 int main(int argc, char *argv[]) { Settings.ResetSettings(); // insert code here Settin

大家好,在我的前一个问题中,我能够获取要加载到文件中的结构的数据,但现在的问题是,我在检索它时获取垃圾值

文件内容:settings.bin 代码 为什么我会得到这些垃圾值?谁能帮帮我,因为我认为它不应该像这样出现(?)。对于结构数组中的每个这样的元素,我应该得到1


提前谢谢

您似乎忘记将设置加载到文件中

int main(int argc, char *argv[])
{
    Settings.ResetSettings();  // insert code here
    Settings._SettingsClass();
    //    cout<<Settings.GetSetting(1).SettingName;
    system("PAUSE");
    return EXIT_SUCCESS;
}
intmain(intargc,char*argv[])
{
Settings.ResetSettings();//在此处插入代码
设置。_设置类();

//cout格式化输入需要分隔符,以便它知道何时停止读取特定值。即使您以二进制模式打开文件,但实际上您正在写入的是一个没有分隔符的文本文件,因此无法读回

如果必须具有二进制文件,则这是使用您的结构读取/写入二进制文件的方法:

#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>
#include <vector>

const char* SettingsFilePath = "settings.bin";

struct Setting
{
    int SettingID;
    int SettingINTValue;
    double SettingDOUBLEValue;
    char SettingCHARValue;
    std::string SettingSTRINGValue;
    std::string SettingName;

    Setting()
        : SettingID(0)
        , SettingINTValue(0)
        , SettingDOUBLEValue(0)
        , SettingCHARValue(0)
    {
    }

    void Write(std::fstream& out)
    {
        out.write(reinterpret_cast<const char*>(&SettingID), sizeof(SettingID));

        out.write(reinterpret_cast<const char*>(&SettingINTValue), sizeof(SettingINTValue));

        out.write(reinterpret_cast<const char*>(&SettingDOUBLEValue), sizeof(SettingDOUBLEValue));

        out.write(reinterpret_cast<const char*>(&SettingCHARValue), sizeof(SettingCHARValue));

        size_t str_size = SettingSTRINGValue.size();
        out.write(reinterpret_cast<const char*>(&str_size), sizeof(str_size));
        out.write(SettingSTRINGValue.c_str(), SettingSTRINGValue.size());

        str_size = SettingName.size();
        out.write(reinterpret_cast<const char*>(&str_size), sizeof(str_size));
        out.write(SettingName.c_str(), SettingName.size());
    }

    void Read(std::fstream& in)
    {
        in.read(reinterpret_cast<char*>(&SettingID), sizeof(SettingID));

        in.read(reinterpret_cast<char*>(&SettingINTValue), sizeof(SettingINTValue));

        in.read(reinterpret_cast<char*>(&SettingDOUBLEValue), sizeof(SettingDOUBLEValue));

        in.read(reinterpret_cast<char*>(&SettingCHARValue), sizeof(SettingCHARValue));

        size_t str_size;
        std::vector<char> str_data;

        in.read(reinterpret_cast<char*>(&str_size), sizeof(str_size));
        str_data.resize(str_size);
        in.read(&str_data[0], str_size);
        SettingSTRINGValue.assign(str_data.begin(), str_data.end());

        in.read(reinterpret_cast<char*>(&str_size), sizeof(str_size));
        str_data.resize(str_size);
        in.read(&str_data[0], str_size);
        SettingName.assign(str_data.begin(), str_data.end());
    }

    void Print(const std::string& title)
    {
        std::cout << title << "\n";
        std::cout << std::string(title.size(), '-') << "\n";

        const size_t w = 22;
        std::cout << std::setw(w) << std::right << "SettingID : " << SettingID << "\n";
        std::cout << std::setw(w) << std::right << "SettingINTValue : " << SettingINTValue << "\n";
        std::cout << std::setw(w) << std::right << "SettingDOUBLEValue : " << SettingDOUBLEValue << "\n";
        std::cout << std::setw(w) << std::right << "SettingCHARValue : " << SettingCHARValue << "\n";
        std::cout << std::setw(w) << std::right << "SettingSTRINGValue : " << SettingSTRINGValue << "\n";
        std::cout << std::setw(w) << std::right << "SettingName : " << SettingName << "\n";

        std::cout << "\n";
    }
};

int main()
{
    {
        Setting s;
        s.Print("Default before Write");

        s.SettingID = 1;
        s.SettingINTValue = 2;
        s.SettingDOUBLEValue = 3.5;
        s.SettingCHARValue = 'Z';
        s.SettingSTRINGValue = "Blah Blah";
        s.SettingName = "Some Settings";

        std::fstream f(SettingsFilePath, std::ios::out | std::ios::binary);
        s.Write(f);

        s.Print("Values written to file");
    }

    {
        Setting s;
        s.Print("Default before read");

        std::fstream f(SettingsFilePath, std::ios::in | std::ios::binary);
        s.Read(f);
        s.Print("Values after read");
    }

    return EXIT_SUCCESS;
}
#包括
#包括
#包括
#包括
#包括
const char*SettingsFilePath=“settings.bin”;
结构设置
{
int设置ID;
int设置int值;
双重设置双重值;
字符设置字符值;
std::字符串设置StringValue;
std::字符串设置名称;
设置()
:SettingID(0)
,设置IntValue(0)
,设置双值(0)
,设置字符值(0)
{
}
无效写入(标准::fstream&out)
{
out.write(重新解释强制转换(&SettingID),sizeof(SettingID));
out.write(重新解释强制转换(&SettingINTValue)、sizeof(SettingINTValue));
out.write(重新解释强制转换(&SettingDOUBLEValue),sizeof(SettingDOUBLEValue));
out.write(重新解释强制转换(&SettingCHARValue),sizeof(SettingCHARValue));
size_t str_size=SettingSTRINGValue.size();
out.write(重新解释强制转换(&str_大小)、sizeof(str_大小));
write(setingStringValue.c_str(),setingStringValue.size());
str_size=SettingName.size();
out.write(重新解释强制转换(&str_大小)、sizeof(str_大小));
out.write(SettingName.c_str(),SettingName.size());
}
无效读取(标准::fstream&in)
{
in.read(reinterpret_cast(&SettingID),sizeof(SettingID));
in.read(reinterpret_cast(&SettingINTValue),sizeof(SettingINTValue));
in.read(重新解释强制转换(&SettingDOUBLEValue),sizeof(SettingDOUBLEValue));
in.read(reinterpret_cast(&SettingCHARValue),sizeof(SettingCHARValue));
大小(str)大小;;
std::矢量str_数据;
in.read(重新解释强制转换(&str_大小)、sizeof(str_大小));
str_data.resize(str_大小);
读取(&str_数据[0],str_大小);
SettingSTRINGValue.assign(str_data.begin(),str_data.end());
in.read(重新解释强制转换(&str_大小)、sizeof(str_大小));
str_data.resize(str_大小);
读取(&str_数据[0],str_大小);
SettingName.assign(str_data.begin(),str_data.end());
}
无效打印(常量标准::字符串和标题)
{

谢谢,你的很好!
4473076
1
3
0
2686384
int main(int argc, char *argv[])
{
    Settings.ResetSettings();  // insert code here
    Settings._SettingsClass();
    //    cout<<Settings.GetSetting(1).SettingName;
    system("PAUSE");
    return EXIT_SUCCESS;
}
#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>
#include <vector>

const char* SettingsFilePath = "settings.bin";

struct Setting
{
    int SettingID;
    int SettingINTValue;
    double SettingDOUBLEValue;
    char SettingCHARValue;
    std::string SettingSTRINGValue;
    std::string SettingName;

    Setting()
        : SettingID(0)
        , SettingINTValue(0)
        , SettingDOUBLEValue(0)
        , SettingCHARValue(0)
    {
    }

    void Write(std::fstream& out)
    {
        out.write(reinterpret_cast<const char*>(&SettingID), sizeof(SettingID));

        out.write(reinterpret_cast<const char*>(&SettingINTValue), sizeof(SettingINTValue));

        out.write(reinterpret_cast<const char*>(&SettingDOUBLEValue), sizeof(SettingDOUBLEValue));

        out.write(reinterpret_cast<const char*>(&SettingCHARValue), sizeof(SettingCHARValue));

        size_t str_size = SettingSTRINGValue.size();
        out.write(reinterpret_cast<const char*>(&str_size), sizeof(str_size));
        out.write(SettingSTRINGValue.c_str(), SettingSTRINGValue.size());

        str_size = SettingName.size();
        out.write(reinterpret_cast<const char*>(&str_size), sizeof(str_size));
        out.write(SettingName.c_str(), SettingName.size());
    }

    void Read(std::fstream& in)
    {
        in.read(reinterpret_cast<char*>(&SettingID), sizeof(SettingID));

        in.read(reinterpret_cast<char*>(&SettingINTValue), sizeof(SettingINTValue));

        in.read(reinterpret_cast<char*>(&SettingDOUBLEValue), sizeof(SettingDOUBLEValue));

        in.read(reinterpret_cast<char*>(&SettingCHARValue), sizeof(SettingCHARValue));

        size_t str_size;
        std::vector<char> str_data;

        in.read(reinterpret_cast<char*>(&str_size), sizeof(str_size));
        str_data.resize(str_size);
        in.read(&str_data[0], str_size);
        SettingSTRINGValue.assign(str_data.begin(), str_data.end());

        in.read(reinterpret_cast<char*>(&str_size), sizeof(str_size));
        str_data.resize(str_size);
        in.read(&str_data[0], str_size);
        SettingName.assign(str_data.begin(), str_data.end());
    }

    void Print(const std::string& title)
    {
        std::cout << title << "\n";
        std::cout << std::string(title.size(), '-') << "\n";

        const size_t w = 22;
        std::cout << std::setw(w) << std::right << "SettingID : " << SettingID << "\n";
        std::cout << std::setw(w) << std::right << "SettingINTValue : " << SettingINTValue << "\n";
        std::cout << std::setw(w) << std::right << "SettingDOUBLEValue : " << SettingDOUBLEValue << "\n";
        std::cout << std::setw(w) << std::right << "SettingCHARValue : " << SettingCHARValue << "\n";
        std::cout << std::setw(w) << std::right << "SettingSTRINGValue : " << SettingSTRINGValue << "\n";
        std::cout << std::setw(w) << std::right << "SettingName : " << SettingName << "\n";

        std::cout << "\n";
    }
};

int main()
{
    {
        Setting s;
        s.Print("Default before Write");

        s.SettingID = 1;
        s.SettingINTValue = 2;
        s.SettingDOUBLEValue = 3.5;
        s.SettingCHARValue = 'Z';
        s.SettingSTRINGValue = "Blah Blah";
        s.SettingName = "Some Settings";

        std::fstream f(SettingsFilePath, std::ios::out | std::ios::binary);
        s.Write(f);

        s.Print("Values written to file");
    }

    {
        Setting s;
        s.Print("Default before read");

        std::fstream f(SettingsFilePath, std::ios::in | std::ios::binary);
        s.Read(f);
        s.Print("Values after read");
    }

    return EXIT_SUCCESS;
}