文件的概念
文件: 是驻留在外储存器上,具有标识名的一组信息的集合,用来永久保存数据。
与文件相关的概念: 数据项(字段),记录,文件,数据库。
外存: 程序可以直接访问内存中的数据,但不能直接访问外存。
外存和程序之间的 I/O 需要经过输入输出缓冲。外存到缓冲区由操作系统控制,缓冲区到内存由程序控制。
磁道:存储信息的场所。
柱面:不同盘片的同一磁道。
扇区:磁道划分成扇区,储存一个数据块。
流式文件
文件和流: C++ 把每个文件都看成一个有序的字节流,每个文件以 EOF (end-of-file marker) 结束
ASCII 文件: 也被称为文本文件,将文件中的每个字节解释成一个字符的ASCII值,可以直接显示在显示器上
二进制文件: 将文件中的每个字节仅看成是一个二进制比特串,由程序解释比特串的含义
文件的访问过程
访问文件步骤: 定义流对象,打开文件,操作文件数据,关闭文件。
定义流对象:ifstream 、ofstream 、fstream
打开和关闭文件: 成员函数 open 以及 close
文件打开模式:
检查是否打开成功: 打开失败值为 false、fail 函数、is_open 函数。
文件实例(上)
图书馆的书目管理系统
功能: 初始化系统、添加书、借书、还书、显示书库信息
每本书需要记录的信息
馆藏号(整型数):要求自动生成
书名(最长20个字符的字符串)
借书标记。借书标记中记录的是借书者的借书证号,假设也是整型数。
文件设计:文件头存书的数量,然后顺序存放书本数据信息
book类设计
数据成员:馆藏号、书名、借书标记
成员函数:构造函数、借书还书、显示书的详细信息
book类实现
Book::Book(const char *s, int totalNo) { no = totalNo; borrowed = 0; strcpy(name, s); } void Book::borrow(int readerNo) { if (borrowed != 0) cerr << "本书已被借,不能重复借\n"; else borrowed = readerNo; } void Book::Return() { if (borrowed == 0) cerr << "本书没有被借,不能还\n"; else borrowed = 0; } void Book::display() const { cout << setw(10) << no << setw(20) << name << setw(10) << borrowed << endl; }
文件实例(下)
系统分解
每个功能用一个函数实现
Main函数:显示菜单,根据用户的选择调用相应的函数
Main函数
int main() { int selector; while (true) { cout << "0 -- 退出\n"; cout << "1 -- 初始化文件\n"; cout << "2 -- 添加书\n"; cout << "3 -- 借书\n"; cout << "4 -- 还书\n"; cout << "5 -- 显示所有书目信息\n"; cout << "请选择(0-5):"; cin >> selector; if (selector == 0) break; switch (selector) { case 1: initialize(); break; case 2: addBook(); break; case 3: borrowBook(); break; case 4: returnBook(); break; case 5: displayBook(); break; } } return 0; } Initialize的实现 void initialize() { ofstream outfile("book"); outfile.close(); } addBook的实现 void addBook() { char ch[20]; Book *bp; ofstream outfile("book", ofstream::app | ofstream::ate | ofstream::binary); long int no = outfile.tellp() / sizeof(Book) + 1 ; cout << "请输入书名:"; cin >> ch; bp = new Book(ch, no); outfile.write( reinterpret_cast<const char *>(bp), sizeof(*bp)); delete bp; outfile.close(); } borrowBook的实现 void borrowBook() { int bookNo, readerNo; fstream iofile("book", fstream::binary); Book bk; cout << "请输入书号和读者号:"; cin >> bookNo >> readerNo; iofile.seekg((bookNo - 1) * sizeof(Book)); iofile.read( reinterpret_cast<char *> (&bk), sizeof(Book) ); bk.borrow(readerNo); iofile.seekp((bookNo - 1) * sizeof(Book)); iofile.write(reinterpret_cast<const char *>(&bk), sizeof(Book)); iofile.close(); } returnBook的实现 void returnBook() { int bookNo; fstream iofile("book", ofstream::binary ); Book bk; cout << "请输入书号:"; cin >> bookNo ; iofile.seekg((bookNo - 1) * sizeof(Book)); iofile.read(reinterpret_cast<char *> (&bk), sizeof(Book)); bk.Return(); iofile.seekp((bookNo - 1) * sizeof(Book)); iofile.write( reinterpret_cast<const char *>(&bk), sizeof(Book)); iofile.close(); } displayBook的实现 void displayBook() { ifstream infile("book", ofstream::binary); Book bk; infile.read(reinterpret_cast<char *> (&bk), sizeof(Book)); while (!infile.eof()) { bk.display(); infile.read(reinterpret_cast<char *> (&bk), sizeof(Book)); } infile.close(); }