C++输入输出流

C++输入输出流

一、关于C++ IO库

1.引言

​ c++使用类型安全的IO流操作,不同类型的IO流操作都是重载的,没有定义过IO功能的类型不具备IO操作能力。

​ 通过修改 和扩充,C++既可以为标准数据类型的IO,也能用于自定义类型的IO,这种扩展性是C++最有价值的特点之一。

​ 所谓流stream是指数据从一个未知流向另一个位置,流是字节的序列。

​ 输入输出是一种数据传递操作,可以看作字符序列在计算机内存与外设之间的流动,c++将数据从一个对象到另一个对象的流动称为流。

2.IO流库的层次结构

​ ·C++ IO流库中有两个平行基类:

streambuf

ios

​ ios直接派生类:

​ ·输入流类istream

​ ·输出流类ostream

​ ·文件流类基类fstreambase

​ ·字符串流类基类strstreambase

3.IO流库的头文件

​ iostream:包含了对输入输出流进行操作的基本信息,还包括cin、cout、cerr、clog

​ fstream:用于用户管理文件的IO操作

​ strstream:用于字符串流IO

​ stdiostream:用于混合使用C和C++的IO操作

​ iomanip:用于格式化IO

二、无格式输入输出

​ 无格式IO就是按照系统预定义的格式进行输入输出

​ cin用于处理标准输入,即键盘输入

​ cout用于处理标准输出,即屏幕输出

​ 原函数:

ostream cout(stdout);
istream cin(stdin);

​ 重载运算符>>和<<:

cin>>E1>>E2;
cout<<E<<E2<<endl;//endl用于换行

三、C++的格式化输入输出

1.方式一 用流对象的成员函数格式化

​ 流成员函数主要是通过对状态标志、输出宽度、填充字符以及输出精度的操作来完成输入、输出格式化。

​ 输入输出的格式由各种状态标志来决定,在ios类中定义为枚举量。

​ 因为定义在ios类中,引用时必须包含ios::前缀。使用时全用符号名,不能用数值。

//设置状态标志的函数
long ios::setf(long flags);
//清除状态标志的函数
long ios::unsetf(long flags);
//用函数flags取状态标志的两种形式:
long ios::flags();
long ios::flags(long flag);
//用于设置输出宽度(只对其后的第一个输出项有效)
int ios::width(int len);//设置输出宽度,并返回原输出宽度
int ios::width();//返回当前输出宽度,默认输出宽度为0
//设置填充字符(当输出值不满输出宽度时用填充字符填充,故需要与width函数配合使用)
char ios::fill(char ch);//设置填充字符,并返回设置前的填充字符
char ios::fill();//返回当前填充字符
//设置输出精度(默认为6)
int ios::precision(int p);//重新设置输出精度
int ios::precision();//返回当前输出精度
//输出单个字符:
char ios::put();
//读入一个字符(若遇到文件结束符,函数的返回值就是读入的字符,遇到输入流文件结束符返回EOF)
char ios::get();
char ios::get(char ch);//读入的参数赋值给ch
void ios::get(char *ch,int n,char end);//在遇到end字符前读n-1个字符赋值给*ch
//读入一行字符
void ios::getline(char *ch,int n,char end);

​ istream其他成员函数

bool eof();//表示文件结束
char peek();//观察返回下一个字符,观察指的是流指针位置不变
void putback();//将前面用get或getline读取的字符插入到当前流指针位置
void ignore(int n,char end);//跳过n个字符,遇到end不继续跳
void ignore();//ignore(1,EOF)

​ 以上函数的使用:

<流对象名>.<函数名>(ios::<状态标志>);
cout.setf(ios::showpos);//设置状态标志showpos
cout.unsetf(ios::showpos);//删除状态标志showpos
cout.with(10);//设置宽度十
cout.put('a').put(97);//输出aa
cin.get(ch,20,'\n');//读到换行符号之前读19个字符给ch
cin.eof();//文件结束返回true
cin.peek();//观察返回下一个字符
cin.ignore(5,'A');//跳过五个字符,遇到A不继续跳

2.方式2:用控制符格式化

//设置输入输出宽度setw(int)
//只对后边第一个输入输出有效
//实际宽度小向右对其
//反之按数据实际宽度输出
cout<<E1<<setw(6)<<E2<<setw(4)<<E3;
//设置填充字符setfill(char)
//设置后直到下一次设置前一直有效
cout<<E1<<setfill('a')<<E2<<setfill('b')<<E3;
//设置输出精度setprecision(int)
//参数为0默认六位输出
cout<<E1<<setprecision(6)<<E2<<setprecision(4)<<E3;
//设置标志setiosflags(long flag)
cout<<setiosflags(ios::fixed)<<E;
//设置终止输出格式resetiosflags()
cout<<resetiosflags();
//设置输入输出整数数制dec hex oct
//换行控制符endl
//输出单字符控制符ends

​ 用户自定义控制符:

ostream &<控制符函数名>(ostream stream){
	//自定义语句
	return stream;
}
istream &<控制符函数名>(istream stream){
	//自定义语句
	return stream;
}

3.flags:

flag参数作用
ios::fixed定点数表示实数
ios::scientific科学计数法表示实数
ios::left左对齐
ios::right右对齐
ios::uppercase大写表示
ios::showpos输出正数时给出+
ios::skipws忽略前导空格

四、文件的输入输出

1.文件

​ C++把文件看作是一个字符(字节)的序列,即由一个个字符(字节)顺序组成;

​ 根据数据组织形式,可分为ASCII文档和二进制文件

2.文件流

​ iostream->fstream

​ istream->ifstream (mod值ios::in)

​ ostream->ofstream (mod值ios::out)

void open(char *filename,int mod);//使用open()函数简历或打开一个文件
void close();//使用close()函数关闭一个文件
void read(char *ch,int len);//读入len个字符
void write(char *ch,int len);//读入len个字符
//示例
#include<iostream>
#include<fstream>
using namespace std;
int main(){
    char s[100];
	ofstream ostrm;
    ostrm.open("f1.txt",ios::out);
    ostrm.write(s,10);
    ostrm<<120<<endl;//写操作
    ostrm.close();
    ifstream istrm;
    istrm.open("f2.txt",ios::in);
    cin>>s;
    istrm.read(s,10);
    istrm.close();
}

五、字符串流(内存流)

1.特点

​ 以字符数组作为输入输出对象

​ 具有相应缓冲区

​ 在字符数组中可以存放字符,也可以存放整数、浮点数

2.原型

ostrstream::ostrstream(char *buffer,int n,int mod=ios::out);
istrstream::istrstream(char *buffer,int n);
istrstream::istrstream(char *buffer);
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李星且小白blog.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值