c++输入输出流

1.用于输入输出的流类:

iostream 通用输入输出的头文件 使用cin /cout 需要此头文件
fstream 用于文件的 I/O操作
strstream 用于字符串流的I/O 的操作

stdiostream 用于混合使用C和C + +的I/O机制时,例如想将C程序转变为C++程序
c++输入输出流_第1张图片

iomanip 用于输入输出 格式的控制
c++输入输出流_第2张图片
eg: cout<

2. 输入输出 类的继承

c++输入输出流_第3张图片
ios是抽象基类,由它派生出istream类和ostream类, iostream类支持输入输出操作,iostream类是从istream类和ostream类通过多重继承而派生的类

类ifstream继承了类istream,类ofstream继承了类ostream,类fstream继承了 类iostream
iostream头文件中4种流对象

iostream头文件中4种流对象

对象 含义 对应设备 对应的类 c语言中相应的标准文件
cin 标准输入流 键盘 istream_withassign stdin
cout 标准输出流 屏幕 ostream_withassign stdout
cerr 标准错误流 屏幕 ostream_withassign stderr
clog 标准错误流 屏幕 ostream_withassign stderr

3、标准输入流 cin

重点掌握的函数

cin.get()
可以接受空格 读取成功返回非零值,若失败(如遇见了结束符EOF)
则返回非零值 , >> 在默认情况下拒绝接受空白字符

cin.getline()
只能输入字符
常用形式

cin. getline(字符数组,字符个数,终止标志符)

cin. getline(字符指针,字符个数,终止标志符)

cin.ignore()
跳过输入流中的n个字符默认为一个 或遇见指定字符(默认为EOF)提前结束
调用形式

cin.ignore(n,终止字符)
cin.ignore(10,'t') //跳过10个字符 或遇见 ‘t’ 就不再跳了

可以不带参数

cin.ignore() //相当于 cin.ignore(1,EOF)

cin.peek() //检查下一个输入的字符,不会把字符从流中移除
cin.putback() //返回一个字符给一个流

重要
1、使用cin,从流中读出的字符,流中就没有这字符了,再次读取时只能读取剩下的
2、缓冲去只有在遇到EOF、手动敲回车、流(缓存区)满时,才将流中的字符全部读出(即清空缓存区)

4、标准输出流 cout

cout.put() //把字符写入流中 eg : cout.put(60+20)
cout.write() //将字符串写入当前输出流中
cout.flush() //清空缓冲区

cout补充
1、用“cout<<”输出基本类型的数据时,可以不必考虑数据是什么类型,系统会判断数据的类型 并根据其类型选择调用与之匹配的运算符重载函数。这个过程都是自动的,用户不必干预。如果在C语言中用prinf函数输出不同类型的数据,必须分别指定相应的输出格式符,十分麻烦,而且容易出错
2、cout流在内存中对应开辟了一个缓冲区,用来存放流中的数据,当向cout流插 人一个endl时, 不论缓冲区是否已满,都立即输出流中所有数据,然后插入一个换行符, 并刷新流(清空缓冲区)。注意如果插人一个换行符”\n“(如cout< 3、在iostream中只对"<<“和”>>“运算符用于标准类型数据的输入输出进行了重载,但未对用户声明的类型数据的输入输出 进行重载。 如果用户声明了新的类型,并希望用”<<“和”>>"运算符对其进行输入输出,按照重运算符重载来做。
4. cout 流通常是传送到显示器输出,但也可以被重定向 输出到磁盘文件,而cerr流中的信息只能在显示器输出cerr是不经过缓冲区,直接向显示器上输出有关信息,而clog中的信息存放在缓冲区中,缓冲区满后或遇endl时向显示器输出

5.iOS类有关控制符 流成员函数

c++输入输出流_第4张图片

c++输入输出流_第5张图片
设置状态标志
格式

	long ios::setf(long flags)//将某一状态标志位置“1”

一般形式

	流对象.setf(ios::状态标志)
	istream isobj;
	isobj.setf(ios::skipws);//跳过输入的空白 
	isobj.setf(ios::left)// 设置左对齐

多个标识符用|隔开

	cout.setf(ios::hex|ios::basefield);

清除状态标志·
一般格式

	long ios:: unsetf(long flags);

调用格式

流对象.unsetf(ios::标志状态符);

设置域宽
成员函数为width

int ios :: width(int n);

设置实数精度

int ios::precision(int n);

填充字符

char ios:: fill(char ch);

需注意:
1、fmtflags setf( fmtflags flags ); 使用这种,一定要先取消当前基【cout.unself()】,之后才可以设置新的基
2、fmtflags setf( fmtflags flags, fmtflags needed ); 使用这种,第二个参数设为当前的基,或者当不知道当前基时,设为ios_base::basefield清除当前的所有可能的基

6.c++预定义的操纵符

操纵符 功能 输入/输出
dec 设置整数基数为10 输出和输入
hex 设置整数基数为16 输出和输入
oct 设置整数基数为8 输出和输入
ws 跳过输入的空格符 输入
endl 输出一个换行符并刷新输出流 输出
ends 插入一个空字符null,通常用来结束一个字符串 输出
flush 刷新一个输出流 输出
setbase(n) 设置整数的基数为n(可取0或10代表十进制,8代表八进制和16代表十六进制,默认为0) 输入和输出
setfill(c) 设置填充符(默认为空格) 输出
setprecision(n) 设置实数精度n,原理和成员函数precision一样 输出
setw(n) 设置域宽n 输出
setiosflags(flags) 设置指定状态标志,多个用 分隔符 分隔 输出和输入
resetiosflags(flags) 清除指定状态标志,多个用 分隔符 分隔 输出和输入

操作符setiosflags(flags)和resetiosflags(flags)的部分状态标志:

操纵符 功能
setiosflags(ios::left) 数据左对齐
setiosflags(ios::right) 数据右对齐
setiosflags(ios::fixed) 固定小数位数
setiosflags(ios::scientific) 浮点数以科学记数法(指数)显示
setiosflags(ios::showpos) 在正数前面添加一个“+”号
setiosflags(ios::uppercase) 以科学表示法格式E和以十六进制输出字母时用大写表示
resetiosflags(ios::) 终止已设置的状态标志

输出流自定义操纵符

ostream &操纵符名(ostream &s)
{
  自定义代码
  return s;
}

输入流自定义操纵符

istream &操纵符名(istream &s{
  自定义代码
  return s;
}

7.用户自定义输入输出

重载插入运算符
格式

ostream &operstor <<(ostream &out,user_name & obj)
{
	out<

重载提取运算符

istream &operator>>(istream &in,user_name &obj)
{
	in>>obj.item1;
	in>>obj.item2;
	.
	.
	.
	in>>obj.item;
	return in;
}

以上两个重载函数均不能是所操作类的成员函数,但是可以是该类的友元函数或普通函数。

8.文件原理

进行文件的输入输出前要建立一个流对象,流对象与文件相关联。
建立流的过程,就是定义流对象,,cin cout已经在头文件里定义了

ifstream in;
ofstream out;
fstream both;

文件打开将文件与一个流对象建立联系,一般是用成员函数open打开文件的
若文件存在则打开文件,否则建立该文件
格式

文件流对象.open(文件名,打开方式);
out.open("test.dat",ios::out);

由于输入输出都有自己的默认的形式
ifstream 的默认形式是 ios::in
ofstream 的默认形式是 ios::out
所以可以简写成为

out.open("test.dat");

文件的多种打开方式

frestream mystream;
mystream.open("test.dat",ios::in|ios::out|ios::binary);

定义对象时 调用构造函数打开文件

ofstream out ("test.dat");
等价于
ofstream out;
out.open("test.dat");

说明 文件打开失败的时候 与文件联系的流对象的值将会是0

if(!out)
{
	cout<<"cannot open file!\n";
}

文件关闭

out.close();

文件的读写

#include 
#include  
using namespace std;
int main()
{
	ofstream fout ("f2.text",ios::out);
	//定义文件 fout 打开输出文件f2.dat 
	if(!fout)
	{
		cout<<"cannot open file!\n";
		return 1;
	}
	fout<<"I_love_you \n";//向文件里输入字符串 
	fout<<520<<" "<>str>>i;//从f2 中读取内容
	cout<

打开方式:

方式 作用
ios::app 以输出方式打开文件,写入的数据添加在文件末尾
ios::ate 打开一个已有的文件,文件指针指向文件末尾
ios::in 以输入方式打开文件
ios::nocreate 打开一个已有的文件,如文件不存在,则打开失败。nocreate的意思就是不建立新文件
ios::noreplace 如果文件不存在则建立新文件,如果文件已存在则操作失败,noreplace的意思是不更新原有文件
ios::out 以输出方式打开文件(这是默认方式),如果已有此名字的文件,则将其原有内容全部清除
ios::trunc 打开一个文件,如果文件已存在,则删除其中全部数据,如文件不存在,则建立新文件。如已指定了ios::out方式,而未指定ios::app、ios::ate、ios::in,则隐含为此方式
ios::binary 以二进制打开文件,默认文件为文本形式打开。用文本文件向计算机输入时,回车和换行 ,转换为一个换行符 , 输出时,又转回来,对二进制文件则不进行此转换。
ios::in\ios::out 以输入和输出方式打开文件,文件可读写
ios::out\ios::binary 以二进制的方式打开一个输出文件
ios::in\ios::binary 以二进制的方式打开一个输入文件

文件打开时都有一个文件指针,该指针的初始位置由I/O方式指定,每次读写都从文件指针的当前位置开始。每读入一个字节,指针就后移一个字节。(有的文件两个字节存一个字符,当设定的指针在奇数位上,容易产生乱码)当文件指针移到最后,就会遇到文件结束EOF(文件结束符也占一个字节)

文件关闭,实际上是解除该磁盘文件与文件流的关联,原来设置的工作方式也失效,这样,就不能再通过文件流对该文件进行输入或输出

文件类型:
1、ASCII文件:文件的每一个字节中均以ASCII代码形式存放数据,即一个字节存放一个字符,这个文件就是ASCII文件(或称字符文件)。
2、二进制文件:文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件

你可能感兴趣的:(c++)