C++ 语法基础(五)(二)

简介: C++ 语法基础(五)(二)

文件的概念

文件: 是驻留在外储存器上,具有标识名的一组信息的集合,用来永久保存数据。


与文件相关的概念: 数据项(字段),记录,文件,数据库。


外存: 程序可以直接访问内存中的数据,但不能直接访问外存。


外存和程序之间的 I/O 需要经过输入输出缓冲。外存到缓冲区由操作系统控制,缓冲区到内存由程序控制。


磁道:存储信息的场所。


柱面:不同盘片的同一磁道。


扇区:磁道划分成扇区,储存一个数据块。


image.png


流式文件

文件和流: C++ 把每个文件都看成一个有序的字节流,每个文件以 EOF (end-of-file marker) 结束

ASCII 文件: 也被称为文本文件,将文件中的每个字节解释成一个字符的ASCII值,可以直接显示在显示器上

二进制文件: 将文件中的每个字节仅看成是一个二进制比特串,由程序解释比特串的含义

image.png

文件的访问过程

访问文件步骤: 定义流对象,打开文件,操作文件数据,关闭文件。


定义流对象:ifstream 、ofstream 、fstream


打开和关闭文件: 成员函数 open 以及 close


文件打开模式:


image.png


检查是否打开成功: 打开失败值为 false、fail 函数、is_open 函数。


image.png


文件实例(上)

图书馆的书目管理系统


功能: 初始化系统、添加书、借书、还书、显示书库信息

每本书需要记录的信息

馆藏号(整型数):要求自动生成

书名(最长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;
}

image.png


文件实例(下)

系统分解


每个功能用一个函数实现

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();
  }

image.png


相关文章
|
12天前
|
编译器 C++ 容器
C++语言的基本语法
想掌握一门编程语言,第一步就是需要熟悉基本的环境,然后就是最重要的语法知识。 C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。 对象 - 对象具有状态和行为。例如:一只狗的状态 - 颜色、名称、品种,行为 - 摇动、叫唤、吃。对象是类的实例。 类 - 类可以定义为描述对象行为/状态的模板/蓝图。 方法 - 从基本上说,一个方法表示一种行为。一个类可以包含多个方法。可以在方法中写入逻辑、操作数据以及执行所有的动作。 即时变量 - 每个对象都有其独特的即时变量。对象的状态是由这些即时变量的值创建的。 完整关键字
29 2
|
1月前
|
Java 编译器 程序员
C++中的语法知识虚继承和虚基类
**C++中的多继承可能导致命名冲突和数据冗余,尤其在菱形继承中。为解决这一问题,C++引入了虚继承(virtual inheritance),确保派生类只保留虚基类的一份实例,消除二义性。虚继承通过`virtual`关键字指定,允许明确访问特定路径上的成员,如`B::m_a`或`C::m_a`。这样,即使基类在继承链中多次出现,也只有一份成员副本,简化了内存布局并避免冲突。虚继承应在需要时提前在继承声明中指定,影响到从虚基类派生的所有后代类。**
44 7
|
1月前
|
编译器 C++ 开发者
C++一分钟之-属性(attributes)与属性语法
【7月更文挑战第3天】C++的属性(attributes)自C++11起允许附加编译器指令,如`[[nodiscard]]`和`[[maybe_unused]]`,影响优化和警告。注意属性放置、兼容性和适度使用,以确保代码清晰和可移植。示例展示了如何使用属性来提示编译器处理返回值和未使用变量,以及利用编译器扩展进行自动清理。属性是提升代码质量的工具,但应谨慎使用。
49 13
|
2月前
|
编译器 程序员 C++
C++一分钟之-属性(attributed)与属性语法
【6月更文挑战第28天】C++的属性为代码添加元数据,帮助编译器理解意图。C++11引入属性语法`[[attribute]]`,但支持取决于编译器。常见属性如`nodiscard`提示检查返回值,`maybe_unused`防止未使用警告。问题包括兼容性、过度依赖和误用。使用属性时需谨慎,确保团队共识,适时更新以适应C++新特性。通过示例展示了`nodiscard`和`likely/unlikely`的用法,强调正确使用属性能提升代码质量和性能。
52 13
|
2月前
|
编译器 C语言 C++
|
2月前
|
存储 自然语言处理 编译器
【C++语言1】基本语法
【C++语言1】基本语法
|
3月前
|
编译器 C语言 C++
C++的基本特性和语法
C++的基本特性和语法
46 1
|
3月前
|
存储 C++ 容器
【C++从练气到飞升】09---string语法指南(二)
【C++从练气到飞升】09---string语法指南(二)
|
3月前
|
存储 Linux C语言
【C++从练气到飞升】09---string语法指南(一)
【C++从练气到飞升】09---string语法指南(一)