c++输入输出流

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

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

stdiostream 用于混合使用C和C + +的I/O机制时,例如想将C程序转变为C++程序
在这里插入图片描述

iomanip 用于输入输出 格式的控制
在这里插入图片描述
eg: cout<<setw(5);

2. 输入输出 类的继承

在这里插入图片描述
ios是抽象基类,由它派生出istream类和ostream类, iostream类支持输入输出操作,iostream类是从istream类和ostream类通过多重继承而派生的类

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

iostream头文件中4种流对象

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

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<<a<<"\n"),则只输出和换行,而不刷新cout 流(但并不是所有编译系统都体现出这一区别)。
3、在iostream中只对"<<“和”>>“运算符用于标准类型数据的输入输出进行了重载,但未对用户声明的类型数据的输入输出 进行重载。 如果用户声明了新的类型,并希望用”<<“和”>>"运算符对其进行输入输出,按照重运算符重载来做。
4. cout 流通常是传送到显示器输出,但也可以被重定向 输出到磁盘文件,而cerr流中的信息只能在显示器输出cerr是不经过缓冲区,直接向显示器上输出有关信息,而clog中的信息存放在缓冲区中,缓冲区满后或遇endl时向显示器输出

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

在这里插入图片描述

在这里插入图片描述
设置状态标志
格式

	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<<obj.item1;
	out<<obj.item2;
	.
	.
	.
	out<<obj.item;
	return 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 <iostream>
#include <fstream> 
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<<" "<<hex<<97<<endl;
					//输入一个十进制,一个十六进制的数 
	fout.close();
	ifstream fin("f2.text");//定义fin 打卡输入文件f2 
	if(!fin)
	{
		cout<<"cannot open input file.\n ";
		return 1;
	}
	char str[80];
	int i;
	fin>>str>>i;//从f2 中读取内容
	cout<<str<<" "<<i;
	return 0; 	
 } 

打开方式:

方式作用
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、二进制文件:文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值