gpt4 book ai didi

c++ - 使用流运算符将具有整数值的类保存到二进制文件中 >>/<<

转载 作者:太空狗 更新时间:2023-10-29 22:56:30 25 4
gpt4 key购买 nike

我有一个可能非常简单的问题。我已经看到类似的问题,但我尝试过的所有方法都不适合我的情况。我正在尝试将具有 3 个不同整数值的类保存到二进制文件中。我需要解决这个关于重载 C++ 流运算符“<<”/“>>”的问题。所以我的实际代码似乎将整数值作为二进制文件保存在我的文件中,但是当我尝试从我的二进制文件中加载它们时,它只返回一个与原始值不同的整数值。
我的类(class):

class Time{
public:
int hour;
int minute;
int second;

};

我将单个值保存到文件的方法。我用 reinterpret_cast 尝试了这个,例如没有 :(char*) $time.hour

std::ostream& operator<<(std::ostream &os, Time &time){

os.write(reinterpret_cast<const char *>(&time.hour),sizeof(int));
os.write(reinterpret_cast<const char *>(&time.minute),sizeof(int));
os.write(reinterpret_cast<const char *>(&time.second),sizeof(int));
return os;
}

std::istream& operator >>(std::istream &is,Time &time){

is.read((char*)&time.hour,sizeof(int));
is.read((char*)&time.minute,sizeof(int));
is.read((char*)&time.second,sizeof(int));
return is;
}

我测试功能的代码结果是 1878006928:

int main() {
Time time;
time.hour = 24;
time.minute = 33;
time.second = 10;
std::ofstream os("test.txt", std::ios::binary | std::ios::out);
os << time;
Time time2;
std::ifstream is("test.txt",std::ios::binary | std::ios::in);
is >> time2;
std::cout << time2.hour;

}

希望你能理解我的问题。

最佳答案

正如@ivaigult 所注意到的,您忘记了 std::flush您的 ofstream。为了完成我的回答,我修改了您的代码并添加了一些注释,这很有用。恕我直言,最重要的是避免写这样的东西:

 os.write(reinterpret_cast<const char *>(&time.hour),sizeof(int));

这是非常危险的,因为如果您在 Time 中修改 time.hour 您必须记住 同时修改 sizeof( int) -> sizeof(新类型)。如果您忘记了,您通常会遇到内存损坏错误,而这些错误后来发现并不好笑!在 C++11 中,您可以使用 decltype(time.hour),这给出:like:

os.write(reinterpret_cast<const char *>(&time.hour), sizeof(decltype(time.hour)));

无需进一步补充,这里是经过修改的带有注释的工作 C++11 代码:

#include <fstream>
#include <iostream>

class Time
{
public:
int hour;
int minute;
int second;

// *** would allow you to access protected members (if any)
//
friend std::ostream &operator<<(std::ostream &os, Time &time);
friend std::istream &operator>>(std::istream &is, Time &time);
};

std::ostream &operator<<(std::ostream &os, Time &time)
{

// *** sizeof(in) -> sizeof(decltype(time.hour)
// otherwise bug prone: if you modify the Time class, you have to remember to
// modify this function too!
os.write(reinterpret_cast<const char *>(&time.hour), sizeof(decltype(time.hour)));
os.write(reinterpret_cast<const char *>(&time.minute), sizeof(decltype(time.minute)));
os.write(reinterpret_cast<const char *>(&time.second), sizeof(decltype(time.second)));
return os;
}

std::istream &operator>>(std::istream &is, Time &time)
{

// *** ditto: bug prone
// + be consistent: if you use reinterpret_cast before, use it also here
// and not the C-style cast(char *)
is.read(reinterpret_cast<char *>(&time.hour), sizeof(decltype(time.hour)));
is.read(reinterpret_cast<char *>(&time.minute), sizeof(decltype(time.minute)));
is.read(reinterpret_cast<char *>(&time.second), sizeof(decltype(time.second)));
return is;
}

int main()
{
Time time;
time.hour = 24;
time.minute = 33;
time.second = 10;

// *** std::ios::binary is enough, std::ios::out is redundant with
// std::_o_fstream
std::ofstream os("test.txt", std::ios::binary);
os << time;

// os.close(); or at least a flush
os.flush();

Time time2;
// *** ditto: std::ios::binary is enough
std::ifstream is("test.txt", std::ios::binary);
is >> time2;
std::cout << time2.hour << " " << time2.minute << " " << time2.second;
}

关于c++ - 使用流运算符将具有整数值的类保存到二进制文件中 >>/<<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47910990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com