无法从文件 (C++) 恢复类
Unable to restore a class from file (C++)
我有一个对象列表(类型为Radio_Data(,我需要能够将其存储到文件中并从文件中恢复。我使用以下代码将类保存在二进制文件中:
for (listIter = listCont.begin(); listIter != listCont.end(); listIter++)
{
file.seekg(iter * sizeof(Radio_Data), ios::beg);
file.write((char *)&listIter, sizeof(Radio_Data));
}
并尝试使用以下代码恢复它们:
for(counter = 0; counter < (fileSize/sizePerEntry); counter++)
{
file.seekg((counter) * sizeof(Radio_Data), ios::beg);
file.read((char *)&station, sizeof(Radio_Data));
}
我可以看到在文件中输入的信息,所以我知道保存效果很好。但是,当尝试从文件中读回信息时,会显示不正确的数据。我做错了什么?
class Radio_Data
{
private:
char name[21];
char callsign[5];
char band[3];
char frequency[6];
char type[21];
char city[21];
char phone[11];
char website[41];
public:
Radio_Data();
~Radio_Data(){};
//More public methods
}
保存文件如下所示: 0—F x—F 鹰 ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ ÌÌÌÌÌÌÌÌÌÌÌ5198608520 www.thehawk.ca ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ�(有^一个制表符b-n 0-F和x-F(
此文件应自行解析为:
char name[21] == "the hawk";
char callsign[5] == "CKDK";
char band[3] == "FM";
char frequency[6] == "1039";
char type[21] == "rock";
char city[21] == "Woodstock";
char phone[11] == "5198608520";
char website[41] == "www.thehawk.ca";
提前感谢!
在Visual Studio 2012和OpenBSD g++ 4.2.1版本上尝试了以下(快速而肮脏的(代码,它工作了...
#include <iostream>
#include <fstream>
class Radio_Data
{
public:
char name[21];
char callsign[5];
char band[3];
char frequency[6];
char type[21];
char city[21];
char phone[11];
char website[41];
public:
Radio_Data() {}
~Radio_Data(){}
//More public methods
};
void set(Radio_Data* obj)
{
strcpy(obj->name, "the hawk");
strcpy(obj->callsign, "CKDK");
strcpy(obj->band, "FM");
strcpy(obj->frequency, "1039");
strcpy(obj->type, "rock");
strcpy(obj->city, "Woodstock");
strcpy(obj->phone, "5198608520");
strcpy(obj->website, "www.thehawk.ca");
}
void clear(Radio_Data* obj)
{
memset(obj->name, 0, sizeof(obj->name));
memset(obj->callsign, 0, sizeof(obj->callsign));
memset(obj->band, 0, sizeof(obj->band));
memset(obj->frequency, 0, sizeof(obj->frequency));
memset(obj->type, 0, sizeof(obj->type));
memset(obj->city, 0, sizeof(obj->city));
memset(obj->phone, 0, sizeof(obj->phone));
memset(obj->website, 0, sizeof(obj->website));
}
void prnt(Radio_Data* obj)
{
std::cout << "---start object---" << std::endl;
std::cout << obj->name << std::endl;
std::cout << obj->callsign << std::endl;
std::cout << obj->band << std::endl;
std::cout << obj->frequency << std::endl;
std::cout << obj->type << std::endl;
std::cout << obj->city << std::endl;
std::cout << obj->phone << std::endl;
std::cout << obj->website << std::endl;
std::cout << "----end object----" << std::endl;
}
void write(Radio_Data* obj)
{
std::ofstream o("file.txt");
o.write((char*)obj, sizeof(Radio_Data));
o.close();
}
void read(Radio_Data* obj)
{
std::ifstream i("file.txt");
i.read((char*)obj, sizeof(Radio_Data));
i.close();
}
int main(int argc, char** argv)
{
Radio_Data obj;
clear(&obj);
prnt(&obj);
set(&obj);
prnt(&obj);
write(&obj);
clear(&obj);
prnt(&obj);
read(&obj);
prnt(&obj);
return 0;
}
它在控制台中对两者都有以下输出:
---start object---
----end object----
---start object---
the hawk
CKDK
FM
1039
rock
Woodstock
5198608520
www.thehawk.ca
----end object----
---start object---
----end object----
---start object---
the hawk
CKDK
FM
1039
rock
Woodstock
5198608520
www.thehawk.ca
----end object----
这是文件内容:
窗户:
the hawk CKDK FM 1039 rock Woodstock 5198608520 www.thehawk.ca
和 OpenBSD:
the hawkCKDKFM1039rockWoodstock5198608520www.thehawk.ca
所以你的代码中似乎还有其他不对劲的地方。
- 用C++将哈希表写入文件并从文件中恢复
- Opencv 恢复到比我设置的更高的分辨率
- 变量在使用赋值语句赋值后恢复为以前的值
- 在信号处理程序中捕获C++未处理的异常并恢复应用程序
- 删除所有字符串后如何恢复 QStringList?
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- 如何仅使用一次固定<<设置精度(2)?或者至少恢复到默认行为?
- "co_yield"是否可以在恢复协程时从调用方返回值?
- OpenSSL C API:如何在程序exec()之后恢复TLS连接?
- 通过指针恢复对数组的引用.UB与否?
- 从不同进程中的另一个线程挂起/恢复线程或进程
- 如何在 XML 中正确存储原始字节数据并恢复它?
- ExtTextOut 文本的持续闪烁,在一段时间后,文本将恢复为默认字体
- 模板化类中运算符 + 重载的值的恢复
- C++ 线程创建/删除与线程停止/恢复
- ZMQ::send() 抛出异常并终止 QNX 进程.为什么以及如何从中恢复?
- Windows桌面程序保存您的计算机会话 - 基于程序崩溃时的恢复会话
- xSemaphoreTake 在调用 xSemaphoreGive 后不会恢复任务
- 将类型映射到整数值后,如何在给定整数值的情况下恢复类型?
- 恢复ASIO无堆栈Coroutine