---恢复内容开始---

# 输入输出和文件

istream类 重载了抽取运算符>>,使之可以识别一些基本类型:



cin 可以使用hex,oct,dec等控制符与cin一起使用,来指定将整数解释为十六进制或者八进制或者十进制

int x=0;
cin>>hex>>x;

cin 接收char类型

cin 如何检查输入

流运算符查看输入流的方法:

跳过空白(空格,换行符和制表符) 直到遇到非空白字符为止

输入流持续读入字符,直到不匹配为止,

流状态

...undone

others istream function

文件输入和输出

c++ I/O类软件包处理文件输入输出的方式与处理标准输入输出的方式十分相似。

要写入文件 则创建一个ofstream对象,使用ostream方法。(<<或write())

简单的文件I/O

使得程序写入文件:

  • 创建一个ofstream对象来管理输出流

  • 将该对象与特定文件关联

  • 使用cout 向文件输出,唯一区别就是输出到文件 而不是屏幕

    ofstream fout;
    fout.open("output")
    

或者

    ofstream fout("output");

此方式 如果没有该文件,会创建一个该文件名的文件,若该文件存在,则清空该文件内容 然后将新内容写进去,后面会提到怎么在一个有内容的文件后面添加新内容(以默认模式打开文件进行输出,将自动把文件的长度阶段为零,相当于删除已有内容)

ostream 是 ofstream的基类,因此可以调用所有的ostream方法。ofstream类使用需要输出缓冲区分配空间。

你创建几个ofstream对象,程序就会给你提供几个输出缓冲区,,

读取文件:

  • 创建一个ifstream对象管理输入流
  • 将该对象与特定文件绑定
  • 使用cin 形式使用该对象
    也采用缓冲方式

编码格式和上面如出一辙,不加赘述

当输入输出对象过期时,到文件的连接就会关闭, 也可以使用close()方法手动显示关闭到文件的链接(关闭文件会刷新缓冲区,也就是确保文件得到了更新)

流状态检查&is_open()

c++文件流在ios_base类那里继承了一个流状态成员,以及一个报告状态的方法。 于是我们可以通过流状态判断最后一个流操作是否成功。这个状态包括:

  • 检查试图打开文件成功与否,

    fin.open(argv[file]);
    if(fin.fail()){
      ;
    }
    

也可以直接:

    if(!fin){}

那么现在 我们呢 可以使用一个叫is_open()的方法

这种方法的优点在于: 能够检测出其他方式的不能检测出的微妙问题(检测出 因试图以不合适的文件格式打开文件失败)

打开多个文件

若要使用一个ifstream对象对多个文件一次操作,则应该不对其初始化,然后使用open()函数依次关联

最好使用.clear()方法

文件模式

描述文件如何使用:读,写,追加等
将流与文件关联时,可以提供制定文件的第二个参数,即设置文件模式

    ifstream fin("banjiu",model1);
    ofstream fout();
    fout.open("turtledove",model2);

ios__base 类定义了一个openmode类型,可以选择ios_base类中定义的多个常量来指定模式

open函数第二个参数使用了默认类型:

  • ifstream open() --ios_base::in
  • ofsteram open() --ios_base::out|ios_base::trunc
  • fstream open() 不提供默认模式值
    可以使用ios_base::app 来保留文件内容,在文件尾添加新信息

ios_base::out 单独使用会导致文件截短 但与ios_base::in一起使用,则会尾添加

一些冲突的组合会导致文件无法打开(ios_base::in | ios_base::trunc) 将禁止文件打开 从而由is_open()函数检查出来

ios_base::app ios_base::ate都将文件指针放到文件wei,区别: app模式只允许将数据添加到文件wei,ate模式将文件指针放到文件尾

  • 追加文件 ios_base::out|ios_base::app

  • 二进制文本 二进制文本与文本格式的区别体现在对数字类型的表示上
    要以二进制格式存储数据,要使用write()函数。

    fout.write((char*)&p1,sizeof(p1));