【求助大佬】C++文件读取的一个奇怪问题

hbsjzliuyang 2020-05-13 03:04:11
C++的作业,一个图书管理系统,图书信息我是用链表保存的。调试过程中发现了一个奇怪的现象:图书数量超过9个之后从文件中读取的信息就不正确。在9个及之前,怎么修改信息都没事,从第10个开始就读取不出来正确内容。
这是刚录入还没有保存到文件中的15本书:

保存,关闭程序,再打开,再读取文件就是这玩意:

可以看到,第10个的ID就已经是乱码了,第10个往后就根本找不着了。
单步调试发现,从第10个往后的数据就全是乱码了:

???
这是啥情况?有大佬帮忙看看吗?
附Book类的声明和保存文件、读取文件的代码:
Book类的定义:

class Book {
private:
char name[100];
long long ISBN;
int id;
int state;
char reader[50];
Date borrow_date;
int borrow_time;
Date repay_date;
public:
Book* last;
Book* next;
Book(const char* bookname, long long isbn);
Book();
int borrow(Person* reader, int time);
int repay();
char* show_book_name();
long long show_book_ISBN();
int show_book_state();
string show_borrow_person();
int show_book_id();
Date show_repay_date();
bool is_exceed_limit();
void modify(string s, int a);
void modify(string s, char* a);
void modify(string s, Date a);
void modify(string s, long long a);
};

保存到文件:

void save_book()
{
ofstream out("book.dat", ios::out);
if (out.is_open()) {
out.write((char*)&book_count, sizeof(int));
out.write((char*)&book_last_id, sizeof(int));
Book* p = book_head;
for (int i = 0; i < book_count; i++) {
out.write((char*)p, sizeof(Book));
p = p->next;
}
out.close();
}
else {
cout << "Book信息保存错误。" << endl;
system("PAUSE");
}
}

从文件读取:

ifstream b("book.dat", ios::_Noreplace | ios::binary);
if (b.is_open()) {
Book* last = nullptr;
b.read((char*)&book_count, sizeof(int));
b.read((char*)&book_last_id, sizeof(int));
for (int i = 0; i < book_count; i++) {
Book* p = new Book;
b.read((char*)p, sizeof(Book));
p->next = nullptr;
if (book_head == nullptr) {
book_head = p;
p->last = nullptr;
last = p;
}
else {
p->last = last;
last->next = p;
last = p;
}
}
last_book = last;
b.close();
}
...全文
205 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
轻箬笠 2020-05-13
  • 打赏
  • 举报
回复
很少见到直接将对象写入文件的,因为sizeof(对象)的大小不一定是你想的那样。一般在类里面写个print函数的吧。
hbsjzliuyang 2020-05-13
  • 打赏
  • 举报
回复
问题已经解决,不用再求助了。 是因为保存到文件的时候文件打开方式没加上 ios::binary 导致的。 可能是因为只有1位数的时候,二进制和十进制的表示结果类似,所以1~9就没有问题,但从10开始就不行了。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧