也不算是原创,再做关于图书管理系统时,查看了别人一些博客,做的关于单链表存储图书信息的内容,现在自己学的还是太浅,等以后对数据结构有了更深的认识,希望自己能用双向链表来做出图书管理系统的存储和读取,这样效率会更高些。
这篇文章会提到输入输出流的问题
ifstream: 从硬盘读到内存 <<;
ofstrean: 从内存读到硬盘 >>;
打开文件的方式定义:
ios::binary 以二进制的方式打开,缺省的是文本方式;
ios::out 将数据输出到硬盘中(ofstream);
ios::in 将数据输入到内存中(ifstream);
ios::trunc 如果文件存在,将文件长度设置为0;
ios::app 以追加的方式打开文件;
话不多说,附上自己写的代码;
#include<iostream>
#incude<fstream>
#include<conio.h>
#include<string.h>
using namespace std;
struct Book
{
string Name; //书名
string Author; //作者
string Publisher; //出版商
string Date; //日期
string ISBN; //书号
Book *next;
}
/**************************初始化链表******************************/
void InitList(Book *&L) /*在这里关于L指针的别名,我的理解感觉因为链表*next的原因,要取指针的指针;
{ 只能硬记住了,在列表中对链表的操作常用*&L,等以后更加理解了再来修改。*/
L=new Book //对L进行Book结构体的赋址;
L->next=NULL;
}
/**************************运算符重载<<******************************/
/* 这是对<<的重载,下篇文章会写关于复数的重载,总感觉这两个不一样,也可能是自己菜的缘故把*/
ostream &operator<<(ostream &output,Book *&b) //关于这里的ostream是ofstream的父类,就是继承来的,一个操作文件流。
{
output<<b->Name<<'\t'<<b->Author<<'\t'<<b->Publisher<<'\t'<<b->Date<<'\t'<<b->ISBN<<'\t';
return output;
}
/**************************运算符重载>>******************************/
istream &operator>>(istream &input,Book *&b)
{
input>>b->Name>>b->b->Author->b->Publisher->b->Date->b->ISBN;
return input;
}
/**************************存储图书******************************/
void SaveData(Book *&L)
{
Book *p=L->next;
ofstream outfile; //定义存储文件流
outfile.open("C:/Users/ASUS/Desktop/Book.txt",ios::out); //将文件由内存写到硬盘中
while(p!=NULL) /*这里说明一下为什莫这样能够保存到以前存在的信息,而不
{ 用ios::app从尾部添加,因为这样每次都在L链头前面加,
outfile<<p<<endl; 后面会自动保存到文件不用添加,开始我没注意到,想
p=p->next; 要用ios::app尾加,发现错了。*/
}
outfile.close(); //一定要记得关闭文件。
}
/**************************读取图书******************************/
void ReadData(*&L)
{
Book *r,*s;
r=L;
ifstream infile;
infile("C:/Users/ASUS/Desktop/Book.txt",ios::in|ios::binary) ; //将内容从硬盘读到内存中去
while(infile.peek()!=EOF) //上篇文章已经提到;
{
s=new Book;
infile>>s;
s->next=r->next; //单链表的创建;
r=s;
}
r->next=NULL;
}
/**************************增加图书******************************/
void AddBook()
{
Book *L,*s;
InitList(L);
ReadData(L);
s=new Book;
while(1)
{
cout<<"增加图书信息(Y/N):"<<endl
setbuf(stdin,NULL); //清除缓冲区;
char c=getchar();
if(c=='N')
break;
cout<<"书名:";
cin>>s->Name;
cout<<"作者:";
cin>>s->Author;
cout<<"出版商:";
cin>>s->Publisher;
cout<<"日期:";
cin>>s->Date;
cout<<"书号:";
cin>>s->ISBN;
cout<<"\n\n是否保存图书信息(Y/N):"<<endl;
setbuf(stdin,NULL);
char m=getchar();
if(c=='Y')
{
s->nextL->next;
L->next=s;
SaveData(L);
}
else
cout<<"\n\n保存图书信息失败;\n"<<endl;
}
system("pause"); /*system函数,执行系统shell指令类似;pause类似于“请按任意键返回”等待用户按任
} 意键返回*/
int main()
{
AddBook();
return 0;
}