C++——标准输入输出

一、输入输出流

  1. c++中输入输出流一般指的是由标准库iostream提供的两个类,输入流istream和输出流otream。cin是istream类实例化的输入流对象,cout是ostream类实例化的输出流对象。
  2. 流是指要从某种 IO 设备上读出或写入的字符序列。术语“流”试图说明字符是随着时间顺序生成或消耗的。如果字节流是从设备(如键盘、磁盘驱动器、网络连接等)流向内存,这叫做输入操作。如果字节流是从内存流向设备(如显示屏、打印机、磁盘驱动器、网络连接等),这叫做输出操作。

二、I/O头文件

I/O头文件
头文件函数和描述
<iotream>该文件定义了 cin、cout、cerr 和 clog 对象,分别对应于标准输入流、标准输出流、非缓冲标准错误流和缓冲标准错误流。
<iomanip>该文件通过所谓的参数化的流操纵器(比如 setw 和 setprecision),来声明对执行标准化 I/O 有用的服务。
<fstream>该文件为用户控制的文件处理声明服务。包含文件操作相关类型。

三、标准输入流(cin)

        预定义的对象 cin 是 istream 类的一个实例。cin 对象附属到标准输入设备,通常是键盘。cin 是与流提取运算符 >> 结合使用的。C++ 编译器根据要输入值的数据类型,选择合适的流提取运算符来提取值,并把它存储在给定的变量中。

(一)stream& stream::operator>>()

  • stream类中通过对运算符>>的17种重载,实现了C++内置数据类型的输入。
  • istream类中提供多种辅助输入的成员函数,比较常用的有:get(),getline()

(二)int stream::get();

        get()函数有以下重载:

  1. int get();                             //在输入流中读取一个字符并返回assic,若遇到结束符返回EOF
  2. istream& get(char& c);      //在输入流中读取一个字符并存入引用参数c,返回this指针
  3. istream& get(char* s,long long size,char delim) ;       //从输入流中读取字符存储在s指向的内存中,直到输入流被读取完或者读到了size-1个字符才返回,读取过程中遇到了delim所代表的字符,则提前返回,也就是说__delim相当于是一个终止字符
  4. istream& get(char* s,long long size);                        //从输入流中读取字符存储在s指向的内存中,直到输入流被读取完或者读到了size-1个字符才返回,读取过程中遇到了\n提前返回,也就是上面delim是\n。
  5. istream& get(streambuf *buf,char delim);      //同3,此缓冲区无需长度保护,读完或遇到delim提前返回。输出时需要用到buf.str()函数:cout<<buf.str()<<endl;
  6. istream& get(streambuf* buf);                        //同4,streambuf类缓冲区无需长度保护,读完或遇\n提前返回。输出时需要用到buf.str()函数:cout<<buf.str()<<endl;
    #include<iostream>
    using namespace std;
    #include<string>
    #include<sstream>
    int main(int argc, char const *argv[]) {
    	char c;
    	cout << "cin.get()返回值=" << cin.get() << endl;
    	cin.ignore();            //读取换行符
    
    	cin.get(c);
    	cin.ignore();
    	cout << "c=" << c << endl;
    
    	char str[5];
    	cin.get(str, sizeof(str));
    	cin.ignore();
    	cout << "str=" << str << endl;
    	
    	stringbuf buf;
    	cin.get(buf, '\n');
    	cin.ignore();
    	cout << "buf=" << buf.str() << endl;
    
    	cout << cin.get() << endl;
    	return 0;
    }

    例中istream::ignore()函数的作用是读取缓冲区1个字符,作用和C语言中getchar()差不多。例子中get()函数不会读取最后的换行符。需要ignore()函数将末尾的换行符读掉。

  (三)stream::getline();主要用于文件读取

  1. istream& getline(char *s,long long size,char delim);   //读取一行的字符串放入s指向的内存中,遇到终止字符delim提前结束.
  2. istream& getline(char *s,long long size);        读取一行的字符串放入__s指向的内存中,遇到换行符提前结束,相当于直接读取一行了

  (四)stream::ignore()函数和peek()函数

  1. istream& ignore(long long n,char delim);  //忽略输入流中n个字符,遇到字符delim停止忽略并返回。
  2. istream& ignore(long long n);//忽略输入流中的n个字符。
  3. istream& ignore();//忽略输入流中的单个字符。
  4. int peek();//查看输入流中的下一个字符,但不会从输入流中取出来,字符指针位置也不会发生变化,就是看一眼

四、标准输出流(cout)

        cout 对象"连接"到标准输出设备,通常是显示屏。cout 是与流插入运算符 << 结合使用的。C++ 编译器根据要输出变量的数据类型,选择合适的流插入运算符来显示值。<< 运算符被重载来输出内置类型(整型、浮点型、double 型、字符串和指针)的数据项。流插入运算符 << 在一个语句中可以多次使用,如上面实例中所示,endl 用于在行末添加一个换行符。例如:cout<<name<<" "<<age<<endl;

        首先请包含<iomainip>头文件,setbase、setw、setfill、setiosflags、setprecision等函数均在此标准库。主要用于控制输出格式。

(一)标准输出cout设置输出格式

1.整形数据不同进制的输出

    int a = 10;
	cout << "a=" << dec << a << endl;//十进制
	cout << "a=" << hex << a << endl;//十六进制,字母默认小写
	cout << "a=" << oct << a << endl;//八进制

        十六进制输出大写字母,需要用setiosflags(ios::uppercase)设置;输出小写字母需要用setiosflags(ios::lowercase)设置;且设置后对后续的十六进制输出一直有效。

    int b = 11;
    cout << setiosflags(ios::uppercase) << "a=" << hex << a << endl;
	cout << "b=" << hex << b << endl;

        总结: dec:十进制;hex:十六进制;oct:八进制;setiosflags(ios::uppercase):十六进制字母大写;setiosflags(ios::lowercase):十六进制字母小写;

        TIP: setbase(8/10/16)可替代oct/dec/hex;

                cout<<showpos / setiosflags(ios::showpos) /setf(ios::showpos)可输出符号。

2.输出域宽和填充字符设置

    int a = 10, b = 11;
	string NAME = "name";
	cout << setw(5) << "a===========" << a << endl;
	cout << "b=" << b << endl;
	cout << "NAME=" << setw(10) << NAME << endl;
  • a==========10
    b=11
    NAME=      name

由输出内容可知,setw()函数只会修饰后续第一个输出内容的输出域宽,且不会截取超过限制长度的输出内容。

	int a = 10, b = 11;
	string NAME = "name";
	cout << setw(5) << setfill('#') << "a" << a << endl;
	cout << "b=" << setw(5) << setiosflags(ios::left) << b << endl;
	cout << "NAME=" << setw(10) << NAME << endl;
  • ####a10
    b=11###
    NAME=name######

由输出内容可知,setfill(c)、setiosflags(ios::left/ios::right)设置后对后续所需填充输出内容一直有效。

        总结:setiosflags(ios::right) 靠右对齐;setiosflags(ios::left) 靠左对齐;setfill() 设置填充字符;此三个函数设置后对后续输出一直有效;setw()设置输出域宽,只修饰后续第一个输出内容,且不会截断超过部分内容。

3.浮点数输出格式

setprecision(n);设置实数的精度为n位。setiosflags(ios::fixed);固定的浮点显示。setiosflags(ios::scientific);指数格式输出浮点数。

    double p1 = 3.1415926;
	double p2 = 3.14;
	double p3 = 0.31415926;

	cout << "p1=" << setprecision(4) << p1 << endl;
	cout << "p2=" << setprecision(4) << p2 << endl;
	cout << "p3=" << p3 << endl << endl;
  • p1=3.142
    p2=3.14
    p3=0.3142

setprecision(n)函数设置实数精度,若整数位大于0,则从整数位开始计算,整数位为0时,从小数点后一位开始计算;

    double p1 = 3.1415926;
	double p2 = 3.14;
	double p3 = 0.31415926;

    cout << "p1=" << fixed << p1 << endl;
	cout << "p2=" << fixed << p2 << endl;
	cout << "p3=" << setprecision(3) << p3 << endl << endl;
  • p1=3.141593
    p2=3.140000
    p3=0.314 

setiosflags(ios::fixed) / fixed / cout.setf(ios::fixed) 函数指定小数点后面保留几位小数,默认为6位;和setprecision(n)组合使用设置小数点后保留位数。

    double p1 = 3.1415926;
	double p2 = 3.14;
	double p3 = 0.31415926;

    cout << "p1=" << scientific << p1 << endl;
	cout << "p2=" << scientific << p2 << endl;
	cout << "p3=" << setprecision(2)<<p3 << endl;
  • p1=3.141593e+00
    p2=3.140000e+00
    p3=3.14e-01

setiosflags(ios::scientific) / scientific / cout.setf(ios::scientific) 函数以指数格式输出浮点数,默认小数点后保留6位,和setprecision(n)组合使用设置指数小数点后保留位数。

控制符描述
dec十进制
hex十六进制
oct八进制
setbase(n)设置输出进制n(可代替上面三个控制符)
setw(n)设置输出域宽为n
setfill(c)设置填充字符为c
setprecision(n)设置实数精度
setiosflags(ios::fixed)设置小数保留位数(默认6位),可与setprecision组合使用。
setiosflags(ios::scientific)指数格式输出浮点数(默认6位),可与setprecision组合使用。
setiosflags(ios::left/right)左/右对齐
setiosflags(ios::uppercase)大写输出十六进制字母
setiosflags(ios::lowercase)小写输出十六进制字母
setiosflags(ios::skipws)输入流忽视空白字符(包括制表符换行符)

TIPS:1、以上函数除了setw()输出域宽函数每次使用每次设置,其他函数一次设置,永久有效。

            2、setiosflags()函数均有三种表示方法:

                cout<<setiosflags(ios::scientific) ;

                cout<<scientific;

                cout.setf(ios::scientific);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值