程序的输入是指从外部文件系统输入数据到程序,程序的输出是指从程序输出数据到外部文件系统
- 对系统指定的标准设备进行输入输出,如键盘输入数据和屏幕输出数据,称为标准的输入输出,简称标准I/O。
-
对外存磁盘文件进行输入输出,以外存文件为对象的输入和输出,简称文件I/O。
-
对内存中指定的空间进行输入输出,通常指定一个字符数组(实际上可以存储任何信息)为存储空间,简称串I/O。
cout(console output):控制台输出,是ostream类的对象,在iostream库文件中作为全局对象定义。
和<<配合使用,<<运算符对所有基本类型都进行了重载
ostream& operator<<(ostream& dest, int source);
ostream& operator<<(ostream& dest, char source);
ostream& operator<<(ostream& dest, char* source);
cin(console input):控制台输入,是istream类的对象,在iostream库文件中作为全局对象定义。
和>>配合使用,>>运算符对所有基本类型都进行了重载
istream& operator>>(istream& source, int dest);
istream& operator>>(istream& source, char dest);
istream& operator>>(istream& source, char* dest);
note: >>提取数据以空白符(空格,回车,制表符)为数据的分隔符,因此提取字符串数据时,不能提取空白字符。
格式化输出:
- 使用控制符。在头文件
中 - 使用流对象成员函数
- 设置整数进制
cout.flags(ios::hex)
- 设置域宽(不具有延续性)
cout.width(5)
- 设置填充字符
cout.fill('*')
- 设置浮点数精度
cout.precision(5)
- 设置格式控制
cout.flags(ios::left)
- 设置整数进制
标准输入流成员函数
cin.get()
//在缓冲区获取一个字符
cin.getline()
//在缓冲区获取多个字符
cin.putback()
//放回一个字符到缓冲区
cin.peek()
//窥探一个字符,不取出
cin.ignore()
//忽略一个字符
cin.fail()
//标志位
cin.clear()
//清空标志位
cin.sync()
//数据源和缓冲区同步
文件输入输出流
文件可以分为文本文件和二进制文件。
文本文件也称ASCII码文件,每个字节保存ASCII字符,又称字符文件
二进制文件是将数据按其在内存中的存储方式存放在磁盘上,又称字节文件
输出流对象
1.ofstream ofile;
ofile.open('./file.txt', ios::out);
//第一个参数是文件名,第二个参数是打开方式。与cout一样的模式,只不过cout是标准库为我们提前定义的全局对象,而文件输出流对象需要我们自己定义
2.ofstream ofile('./file.txt', ios::out);
输入流对象
1.ifstream ifile;
ifile.open('./file.txt', ios::in);
//与cin一样的模式,只不过cin是标准库为我们提前定义的全局对象,而文件输入流对象需要我们自己定义
2.ifstream ifile('./file.txt', ios::in);
输入输出流对象
fstream file('./file.txt', ios::in | ios::out | ios::binary);
note:使用fstream创建对象时,如果文件不存在,不能使用ios::in,使用的话会打开文件错误。并且使用fstream类对象进行文件读写时,要注意指针的位置。写完之后,要想读写的文件,要进行指针复位。
文件指针:用于保存在文件中进行读或写的位置。通过对位置指针进行操作,适当地调整读或写的位置,可以实现对磁盘文件的随机访问。(常用于二进制文件)
与ofstream类对应的是写文件指针,指定下一次写数据的位置。相关的操作函数是:
seekp:用于移动指针到指定位置
tellp:返回指针当前的位置
使用方法:
- seekp(n, ios::beg) 从文件开始位置移动n个字节
-
seekp(n, ios::end) 从文件结尾位置移动n个字节
-
seekp(n, ios::cur) 从文件当前位置移动n个字节
n=0,表示移动到指定位置。n>0,表示从指定位置向前移动n个字节。n<0,表示从指定位置向后移动n个字节。
streampos n = ofile.tellp()
streampos可以看作是整型,返回值保存指针当前的位置(从文件起始位置到指针当前位置的字节数)
与ifstream类对应的是读文件指针,指定下一次读数据的位置。相关的操作函数是:
seekg:用于移动指针到指定位置
tellg:返回指针当前的位置
note:fstream类创建的对象可以调用seekp和seekg,并且具有同样的效果。但是ofstream和ifstream对象只能调用自己的指针函数
打开方式
ios::in 打开一个输入文件,是ifstream对象的默认方式
ios::out 打开一个输出文件,是ofstream对象的默认方式。如果存在这个文件,删除原有内容,加上新内容。不存在这个文件就创造这个文件。
ios::binary 以二进制模式打开一个文件(默认是文本模式)
ios::app 打开一个输出文件,用于在文件末尾添加数据,不删除原有内容 //没有该文件,也会创建该文件
ios::ate 打开一个现有文件(用于输入和输出),并定位到文件末尾
ios::trunc 打开一个输出文件,如果存在就删除原有内容
多种打开方式可以联合使用,使用按位或运算符|
文件对象使用后,一定要关闭.文件打开后,要进行判断是否打开成功is_open()
有两个区别标准输入输出流对象的函数
ostream& write(const char* str, int n);
把内存中的一块内容整体写入到输出文件中。主要用于输出数组,字符串和自定义对象等具有连续内存的数据。常用于二进制文件的输出。
ostream& read(const char* str, int n);
把文件中的一块内容整体写入到变量中。主要用于提取数据到数组,字符串和自定义对象中。常用于二进制文件的输入。
bool eof() const;
判断文件流是否结束