概述
-
I/O流
“流”是一个字节序列,指外部设备和计算机内存之间流动的一系列字节,设备可以是控制台窗口、文件等。输入(读)时,字节从输入设备流向内存;输出(写)时,字节从内存流向输出设备。
-
I/O类
序号 头文件 类型 说明 1 iostream istream 通用输入流类,从流读取数据;其他输入流的基类。 2 iostream ostream 通用输出流类,向流写入数据;其他输出流的基类。 3 iostream iostream 读写流 4 fstream ifstream 输入文件流类;从文件读取数据 5 fstream ofstream 输出文件流类;向文件写入数据 6 fstream fstream 读写文件 7 sstream istringstream 从string读取数据 8 sstream ostringstream 向string写入数据 9 sstream stringstream 读写string -
预定义的I/O对象
C++ 预定义了4个I/O对象,定义在命名空间 std 中。
①.cin:istream 类对象,从标准输入设备读取数据;
②.cout:ostream 类对象,向标准输出设备写入数据;
③.cerr:ostream 类对象,向标准输出设备写入错误信息;
④.clog:ostream 类对象,向标准输出设备写入日志信息;
-
流运算符
①.<< :输出运算符,左侧必须是一个 ostream 对象,右侧是要打印的值,返回左侧对象;
②.>> :输入运算符,作侧必须是一个 istream 对象,右侧是要赋值的变量,返回左侧对象;
-
I/O对象的使用
①.不可以对I/O对象进行拷贝,因此不能将形参、返回值类型设置为流类型;
②.进行I/O操作的函数通常以引用的方式传递或者返回流;
③.读写一个I/O对象会改变其对象,因此传递和返回的引用不可以是 const 的
-
判断流是否有效
可以直接将一个流对象当作一个条件使用:
while (cin >> word) { //读操作成功 }
-
输出缓冲区
每个输出流都管理一个缓冲区,用来保存程序读写的数据。缓冲区刷新,即数据真正写到输出设备和文件:
①.程序正常结束时,缓冲区被刷新;
②.缓冲区已满,缓冲区刷新后才能写入新数据;
③.endl:输出一个换行,然后刷新缓冲区;flush:刷新缓冲区,不附加任何字符;ends:输出一个空字符,然后刷新缓冲区
标准库将cin和cout关联在一起,因此从输入流读取数据会先刷新关联的输出流。
文件流类
-
文件的概念
文件是在计算机内存中以二进制表示的数据在外部存储介质上的另一种存放形式,可以使数据得以长期保存。
①.文本文件:是由字符序列组成,每一个字节以 ASCII 码形式存放一个字符;可以用文件编辑器打开阅读,读写时需要进行格式转换。
②.二进制文件:是按数据在内存中的存储原样格式存储到磁盘文件中;读写时不需格式转换,文本编辑器打开看到是乱码。
-
fstream
fstream 继承自 iostream ,可以像操作 cin 和cout 对象一样来操作 fstream ,同时 fstream 也增加了一些新的操作。
-
文件操作的一般步骤
对文件的操作一般包括以下步骤:
①.打开文件用于读或者写;
②.检查文件是否打开成功;
③.读或者写操作
④.检查是否读完
⑤.使用完文件后要关闭文件
-
向文件中写数据
①.打开写文件
//方法1: ofstream out;//建立文件输出流对象,未关联文件 out.open("data.txt");//打开指定文件,使 out 对象和文件关联 //方法2: ofstream out("data.txt");//构造一个 ofstream 对象,并打开指定文件
②.判断是否打开成功
ofstream out("data.txt"); if( out ) { //打开成功 }
②.向文件写数据
ofstream out("data.txt"); if( out ) { //打开成功 out << " hello word" << endl; }
③.关闭文件
ofstream out("data.txt"); if( out ) { //打开成功 out << " hello word" << endl;//写数据 } out.close();//关闭文件
只有进行 close操作后,才可以继续打开新的文件。
-
从文件中读数据
①.打开读文件
//方法1: ifstream in;//建立文件输入流对象,未关联文件 in.open("data.txt");//打开指定文件,使 in 对象和文件关联 //方法2: ifstream in("data.txt");//构造一个 ifstream 对象,并打开指定文件
②.检测文件尾
ifstream in("data.txt"); if( in ) { //打开成功 string temp ; while( !in.eof())//未到文件末尾 { in >> temp;//读数据 } } in.close();//关闭文件
-
文件打开模式
①.文件模式
序号 文件模式 说明 1 in 以读方式打开 2 out 以写方式打开 3 app 每次写操作前均定位到文件末尾 4 ate 打开文件后立即定位到文件末尾 5 trunc 截断文件 6 binary 以二进制方式进行IO 以 out 模式打开文件会丢弃已有数据,使用多个打开模式用"|"分隔。
②.默认模式
ifstream:默认以 in 模式打开;
ofstream:默认以 out 模式打开;
fstream:默认以 in 和 out 模式打开;
string类
-
概述
sstream 头文件定义了三个类型来支持内存 IO,这些类型可以向 string 写入数据,从 string 读取数据,就像 string 是一个 IO 流一样。
-
sstream特有操作
sstream strm; // strm是一个未绑定的stringstream对象 sstream strm(s); // strm是一个sstream对象,保存s的一个拷贝 strm.str(); // 返回strm所保存的string的拷贝 strm.str(s); // 将string s拷贝到strm中,返回void
-
读取 string
istringstream 读字符串时遇见空格算一个字符串,就可以读一个句子的单词。
string s = "hello world"; istringstream is(s);// s 关联到 流 string temp; while( !is.eof())//非到末尾 { is >> temp;//读取一个单词到temp }
-
向 string 写数据
ostringstream 流里面可以保存字符串的拷贝,在需要时再一次性输出。
string st = "asdasdasdasd"; string st1; ostringstream os; os << " " << st<< endl; //都写到了流里面 os << " " << st << endl; cout << os.str() << endl; //输出字符串流里面保存的字符串,返回字符串的拷贝 os.str(""); //使用前清空 os.str(st); cout << os.str() << endl; //输出字符串流里面保存的字符串,返回字符串的拷贝