c++知识点10 输入输出 IO 流

输入输出 IO 流
cin 和 cout 充当了 scanf 和 printf 的功能。但他们并不是函数。而是类对象
IO 对象不可复制或赋值
IO 对象是缓冲的
下面几种情况会导致刷缓冲
1,程序正常结束,作为 main 函数结束的一部分,将清空所有缓冲区。
2,缓冲区满,则会刷缓冲。
3,endl, flush 也会刷缓冲。flush刷缓冲不会引入回车
4, 在每次输出操作执行完后,用 unitbuf 操作符设置流的内部状态,从而清空缓冲区
重载了<< 和 和 >> 运算符

标准输出
iomanip 引用流算子的原因是,系统函数格式化并不好用。

#include <iostream>
#include<iomanip>
using namespace std;
int main()
{
    //这个不好用  引出流算子
    int a=0x12345678;
//    cout.unsetf(ios::dec);//关闭十进制
//    cout.setf(ios::hex);//开开十六进制
//    cout<<a<<endl;
//    cout.unsetf(ios::hex);//关闭十六进制
//    cout.setf(ios::oct);//设置八进制
//    cout<<a<<endl;
    //引用流算子的原因是,系统函数格式化并不好用
    cout<<hex<<a<<endl;
    cout<<dec<<a<<endl;
    cout<<oct<<a<<endl;
    return 0;
}
image.png

image.png

image.png

设置域宽setw(n), n 小于实际宽度时,按实际宽度输出,它一次只控制一个数值输出

int main()
{
    int m=1234;
    cout<<"设置域宽: "<<endl;
    cout<<setw(3)<<m<<endl;
    cout<<setw(5)<<m<<endl;
    cout<<setw(10)<<m<<endl;
}
image.png

设置填充字符setfill(c),需要与 setw(n)合用

int main(){
    int x=1234;
    cout<<"设置填充字符: "<<endl;
    cout<<setfill('*')<<setw(5)<<x<<endl;
    cout<<setw(10)<<x<<endl;
}
image.png

设置对齐方式setiosflags(ios::left)(左对齐)、setiosflags(ios::right)(右对齐)

int main(){
    int y=1234;
    cout<<"设置对齐方式"<<endl;
    cout<<setfill(' ');
    cout<<setiosflags(ios::left)<<setw(10)<<y<<endl;
    cout<<setiosflags(ios::right)<<setw(10)<<y<<endl;
}
image.png

强制显示
强制显示小数点和尾 0:setiosflags(ios::showpoint)
强制显示符号:setiosflags(ios::showpos)

int main(){
    double d1=10/5,d2=22.0/7;
    cout<<"显示小数点、尾和数符: "<<endl;
    cout<<d1<<endl;
    cout<<setiosflags(ios::showpoint)<<d1<<endl;
    cout<<setiosflags(ios::showpos)<<d2<<endl;
    cout<<resetiosflags(ios::showpos);
    cout<<d2<<endl;
}
image.png

设置精度(有效数字个数)
setprecision(n)自动四舍五入

int main(){
    double dd=123.4567;
    cout<<setprecision(2)<<dd<<endl;
    cout<<setprecision(3)<<dd<<endl;
    cout<<setprecision(4)<<dd<<endl;
    cout<<setprecision(5)<<dd<<endl;
}
image.png

设置浮点数的输出是以科学记数法还是定点数
setiosflags(ios::scientific)(科学记数法),此时精度域表示小数位数
setiosflags(ios::fixed)(定点数),此时精度域表示小数位数
setprecision(2)<<setiosflags(ios::fixed)设置小数的精度

int main(){
    double dd=123.4567;
    cout<<setiosflags(ios::scientific)<<dd<<endl;
    cout<<resetiosflags(ios::scientific);
    cout<<setiosflags(ios::fixed)<<dd<<endl;
    cout<<setprecision(2)<<setiosflags(ios::fixed)<<dd<<endl;
}
image.png

输出十六进制数时控制英文字母的大小写
setiosflags(ios::uppercase)
resetiosflags(ios::uppercase)

int main(){
    int num=510;
    cout<<"以大小写方式输出进制数: "<<endl;
    cout<<"16 进制数(默认:小写方式):"<<hex<<num<<endl;
    cout<<"以大写方式输出进制数: "<<setiosflags(ios::uppercase)<<hex<<num<<endl;
    cout<<"恢复小写方式输出进制数: "<<resetiosflags(ios::uppercase)<<hex<<num<<endl;
}
image.png

成员函数
格式:ostream put( char )
功能:输了一个字符。
例子:cout.put('\n');

标准输入 cin
在 C++中,默认的标准输入设备是键盘,在 iostream 文件中定义了 cin 输入流对象。
成员函数
流输入运算符,很大程序上提供了足够的便利,但是也有输入字符串,遇空格则止的问题。
于是,为了弥补其不足,又提供了以下不可或缺的成员函数。
char get() 读入一个字符并返回(包括回车、tab、空格等空白字符)

int main()
{
    char ch;
    while((ch=cin.get())!=EOF)//EOF 为文件结束符,按 ctrl+d 输入
    {
        cout.put(ch);
    }
    return 0;
}

istream& get(char&)
读入一个字符,如果读取成功则返回非 0 值(真),如失败(遇到文件结束符),
则函数返回 0 值(假)。

int main()
{
    char ch;
    while(cin.get(ch),!cin.eof())//逗号表达式  看后面的
        //输入字符判断完之后再判断是否为文件结束符
    {
        cout.put(ch);
    }
    char a,b,c,d;
    cin.get(a).get(b).get(c).get(d);
    cout<<a<<b<<c<<d<<endl;
    return 0;
}

istream& get(char , int ,char )
格式 istream& get(字符数组,字符个数 n,终止字符)或 istream & get(字符指针,字符个数 n,终止字符)
功能 从输入流中读取 n-1 字符,赋给字符数组或字符指针所指向的数组。如果在读取 n-1 个字符之前遇到终止字符,则提前结束。如果成功则返回非 0,失败 则返回 0。会清空 char
指向的空间,未读到 n-1 个字符或中止符,则会阻塞。不会越过中止符。

int main()
{
//去读n个字符,在读完n-1个字符前,遇到了截止符,停止读,返回。截止符没有被读进buf,也没有从流对象中消失或越过
//去读n个字符,在没有遇到截止符前,也没有读完n-1个符,处于阻塞状态
//去读n个字符,在没有遇到截止符前,已读完n-1个字符,留下空间放\0;
//    char buf=new char[1024];
    char buf[1024];
    cin.get(buf,1024,'i');//遇到字符i就截止
    cout<<buf<<endl;
    return 0;
}
image.png
int main()
{
    char buf[1024];
    cin.get(buf,1024,'i');//abcdefgighi
    cout<<buf<<"输入完了"<<endl;
    cin.ignore(1);//忽略一个 不然i过不去
    memset(buf,0,1024);
    cin.get(buf,10,'i'); //fgets()最多读9个  n-1个
    cout<<buf<<"笑一个"<<endl;
    return 0;
}

image.png

istream& getline(char , int , char)
格式 cin.getline(字符数组或字符指针,字符个数 n[,终止字符])
功能 与带三个参数的 get()功能类似,从输入流中读取 n-1 字符,赋给字符数组或字符指针所指向的空间。如果在读取 n-1 个字符之前遇到终止字符(如果不写,默认为’\n’),则提前结束。会清空 char
指向的空间,未读到 n-1 个字符或中止符,则会阻塞。会越过中止符

int main()
{
    //去读n个字符,在读完n-1个字符前,遇到了截止符,停止读,返回。
    //截止符没有被读进buf,越过了截止符
    char buf[1024];
    cin.getline(buf,1024,'i');//’i'不写默认\n
    cout<<buf<<endl;
    cin.getline(buf,1024,'i');
    cout<<buf<<endl;
    return 0;
}
image.png

get 和 getline 最大的区别就是,get 遇到界定符时,停止执行,但并不从流中提取界定符,再次调用会遇到同一个界定符,函数将立即返回,不会提取输入。getline 则不同,它将从输入流中提供界定符,但伤然不会把它放到缓冲区中。

ignore peek putback


image.png
int main()
{
    char buf[1024];
    cin.get(buf,1024,'/');
    cin.ignore(100,'i');//忽略100个 除非遇到了‘i’ 但是会给i也弄没
    cin.putback('i');//为了弥补ignore给i忽略掉了  再给i推回去
    char peek=cin.peek();
    cout<<"peek:"<<peek<<endl;//窥视一下回推的是不是i
    cout<<buf<<endl;
    cin.get(buf,1024,'/');
    cout<<buf<<endl;
    return 0;
}
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。