• C++语言之输入输出介绍


    C++语言之输入输出介绍

    本文包括:C++基本的输入输出、C++如何输入含空格的字符串、C++输入输出的格式控制。

    本文介绍的内容适用于控制台程序,这样才能看到输入与输出的结果,GUI(图形用户界面)的程序就用不上了。

    C++基本的输入输出

    cin和cout

    在C语言中,标准的键盘输入和屏幕输出功能分别使用scanf()和printf()两个函数实现。在C++语言中,类库中提供了输入流类istream和输出流类ostream。cin和cout分别是istream类和ostream类的对象,用来实现基本的键盘输入和屏幕输出。 引入头文件iostream后,就可以使用cin和cout。

    cin和cout是 C++ 的内置对象(预定义的流类对象),cin用来处理标准输入,即键盘输入,因此也称cin是标准输入流对象。cout用来处理标准输出即屏幕输出,因此也称cout是标准输出流对象。

    <<和>>

    从输入流中获取数据的操作称为提取操作,向输出流中添加数据的操作称为插入操作。运算符“>>”和“<<”是移位运算符,但在C++类库中的头文件中已经对“>>”和“<<”进行了重载,使之分别作为流提取运算符和流插入运算符,用来输入和输出C++标准类型的数据。。例如,语句“cin>>x;”从键盘获取输入数据并赋给变量x。使用cin可以获得多个来自键盘的输入值。cout是一个标准输出流对象,使用流插入运算符“<<”向输出设备屏幕输出信息。当程序中用到cin和cout时,需要在程序中包含头文件。

    cin的一般格式如下:

    cin>> <变量名1>[>> <变量名2> >>…>> <变量名n>];

    程序执行到这条语句便暂停下来,等待从键盘上输入相应数据,直到所列出的所有变量均获得值后,程序方继续执行。

    cout的一般格式如下:

    cout<< <表达式1> [<< <表达式2> <<…<< <表达式n>];

    程序执行到这条语句时,将紧跟其后的表达式的值输出到显示器上。

    注意,使用cin和cout必须在程序开头增加一行:

    # include

    或者两行:

    # include

    using namespace std;

    【c++中的#include和using指令(directive)的作用

    #include用于包含其他文件的内容,如用来引入对应的头文件。

    using namespace std;这个using声明是将std命名空间内的名字,全部暴露在外,只要访问std命名空间内的名字,我们都不需要在cin、cout之前写额外的前缀std::。

    更多情况,可参见https://blog.51cto.com/u_15314328/4965070】

    下面给出一个例子,贺卡

    1. #include
    2. using namespace std;
    3. int main(void)
    4. {
    5. string friendName;
    6. string selfName;
    7. cout<<"请输入朋友的名字:";
    8. cin>>friendName;
    9. cout<<"请输入你的名字:";
    10. cin>>selfName;
    11. cout<<"===================================="<
    12. cout<<"My dear "<
    13. cout<<" Happy birthday to you!"<
    14. cout<<" yours, "<
    15. cout<<"===================================="<
    16. return 0;
    17. }

    用Dev-C++编译运行之:

    C++如何输入含空格的字符串

    cin是C++中最常用的输入,用空格或者回车键分隔数据。如用cin>>str;这种方法来接收字符串那么录入的str不能包含空格,否则它会按照空格将整个字符串切分成若干段。

    cin>>a;

    cout<

    如何输入含有空格字符串呢?

    可以使用get()、getline()函数

    头文件 中get()函数

    get 函数是内置在 cin 对象中的,所以可称之为 cin 的一个成员函数。下面仅介绍两种用法,详情可见istream::get - C++ Reference

    用法1: cin.get(字符变量名)

    可以用来接收字符,示例源码:

    1. #include
    2. using namespace std;
    3. main ()
    4. {
    5. char ch;
    6. cout<<"请输入:";
    7. ch=cin.get(); //或者cin.get(ch);
    8. cout<
    9. }

    用Dev-C++编译运行之:

    用法2:cin.get(字符数组名,接收字符数目)

    用来接收一行字符串,可以接收空格,示例源码:

    1. #include
    2. using namespace std;
    3. main ()
    4. {
    5. char a[20];
    6. cout<<"请输入:";
    7. cin.get(a,20);
    8. cout<
    9. }

    用Dev-C++编译运行之:

    在C++中有两种getline()函数,一种在头文件 中,是istream类的成员函数;另一种是在头文件 中,是普通函数。

    头文件 中的getline()函数

    cin.getline 允许读取包含空格的字符串,其语法为:

    getline (char* s, streamsize n [, char delim] );

    参见istream::getline - C++ Reference

    s:它是指向字符串以存储字符的指针。

    n:它表示由a指向的最大字符数。

    delim:这是一个明确的定界字符,默认是 '\n '。

    返回值

    读取n-1个字符(第n个用于保存'/0'),或者遇到指定的定界字符为止。

    可用来接收一行含有空格的字符串,示例源码:

    1. #include
    2. using namespace std;
    3. main ()
    4. {
    5. char m[20];
    6. cout<<"请输入:";
    7. cin.getline(m,7);
    8. cout<
    9. }

    用Dev-C++编译运行之:

    头文件中的getline()函数

    string版本的getline()函数有自动调整大小的功能,不需要指定读取多少个字符的数值参数,其语法为:

    getline (istream& is, string& str [, char delim]);

    参见getline (string) - C++ Reference

    参数

    is:表示一个输入流,例如 cin。

    str:用来存储输入流中的信息

    delim:定界字符,默认是 '\n '

    可用来接收一行含有空格的字符串,示例源码:

    1. #include
    2. #include
    3. using namespace std;
    4. int main ()
    5. {
    6. string s;
    7. cout<<"请输入:";
    8. getline(cin,s);
    9. cout << s << endl;
    10. return 0;
    11. }

    用Dev-C++编译运行之:

    关于C++中getline()的更多情况,可见 https://www.jb51.net/article/180289.htm

    C++输入输出的格式控制

    在没有特地进行格式控制的情况下,输入输出采用默认格式,先看一下这种情况是什么样的。

    默认的输入格式

    C++流所识别的输入数据的类型及其默认的输入格式:

     short、int 、long(signed 、unsigned):与整型常量同;

     float、double、long double:与浮点数常量同;

     char(signed、unsigned):第一个非空白字符;

     char *(signed 、unsigned):从第一个非空白字符开始到下一个空白字符结束;

     void *:无前缀的16进制数;

     bool:把true或1识别为true,其他的均识别为false(VC6.0中把0识别为false,其他的值均识别为true)。

    示例源码

    1. #include
    2. using namespace std;
    3. main ()
    4. {
    5. int a,b; char c; char d[30];
    6. cout<<"请输入值:";
    7. cin>>a>>b>>c>>d;
    8. cout<<"a="<" b="<" c="<" d="<
    9. return 0;
    10. }

    用Dev-C++编译运行之:

    请分析一下,为何请输入:123  456abcdefgh  ijklm

    输出a=123   b=456   c=a   d=bcdefgh

    默认的输出格式

    C++流所识别的输出数据的类型及其默认的输出格式:

      char(signed、unsigned):单个字符(无引号);

      short、int、long(signed  、unsigned):一般整型形式,负数前有-号;

      char *(signed  、unsigned):字符序列(无引号);

      float  、double  、long double:浮点格式或指数格式(科学表示法),取决于哪个更短;

      void *:无前缀的16进制数;

      bool:1或0。

    示例源码

    1. #include
    2. using namespace std;
    3. main ()
    4. {
    5. char c='A';
    6. const char *p="hello!";
    7. cout<<123<-123<
    8. cout<void *)p<
    9. cout<<true;
    10. return 0;
    11. }

    用Dev-C++编译运行之:

    进行输入输出的格式控制,可以使用iostream库,需要加入头文件#include使用,还可以iomanip库,进行输入输出的格式控制,iomanip 是 IO manipulators 的缩写,需要加入头文件#include

    iostream库的每个iostream对象还维护着一个格式状态来控制IO格式化细节。

    iostream库定义了一组操纵符来修改流的格式状态。操纵符是一个函数或对象,会影响流的状态,并能作为输入和输出运算符的运算对象。

    操纵符用于两大类输出控制:控制数值的输出格式,控制补白的数量和位置。大多数改变格式状态的操纵符都是设置/复原成对的,一个操纵符用于设置新格式,另一个用于恢复正常格式。

    当操纵符改变流的格式状态时,通常改变后的状态对所有后续IO都生效。

    bool值默认打印0或1,可以对流使用boolalpha来操纵覆盖这种格式,示例源码:

    1. #include
    2. using namespace std;
    3. main ()
    4. {
    5. cout << "default bool values: " << true << " " << false<< endl;
    6. cout << boolalpha;
    7. cout << "boolalpha bool values: " <<true << " " << false << endl;
    8. cout << noboolalpha; //取消改变用noboolalpha:
    9. cout << "noboolalpha bool values: " <<true << " " << false << endl;
    10. return 0;
    11. }

    用Dev-C++编译运行之:

    默认输出十进制,可以用hex、oct和dec改为十六进制、八进制和十进制。只影响整型。

    示例源码:

    1. #include
    2. using namespace std;
    3. main ()
    4. {
    5. cout << "default: " << 20 << " " << 1024 << endl;
    6. cout << "octal: " << oct << 20 << " " << 1024 << endl;
    7. cout << "hex: " << hex << 20 << " " << 1024 << endl;
    8. cout << "decimal: " << dec << 20 << " " << 1024 << endl;
    9. return 0;
    10. }

    用Dev-C++编译运行之:

    控制浮点数格式

    浮点数的输出格式涉及三个方面:

    输出精度(即输出多少个数字)。

    十六进制、定点十进制或者科学记数法形式输出。

    没有小数部分的浮点值是否输出小数点。

    默认情况下,浮点值按六位数字精度输出;如果浮点值没有小数部分,则不输出小数点;根据浮点数的值选择输出为定点十进制或科学计数法形式:非常大或非常小的值输出为科学记数法形式,其他值输出为定点十进制形式。

    默认情况下,精度控制输出的数字总位数。输出时,浮点值按照当前精度四舍五入而非截断。

    调用IO对象的precision成员或者使用setprecision操纵符可以改变精度。

    示例源码:

    1. #include
    2. #include
    3. using namespace std;
    4. main ()
    5. {
    6. // cout.precision返回当前精度值
    7. cout << "Precision: " << cout.precision() << ", Value: " << sqrt(2.0) << endl;
    8. // cout.precision(12)将打印精度设置为12位数字
    9. cout.precision(12);
    10. cout << "Precision: " << cout.precision() << ", Value: " << sqrt(2.0) << endl;
    11. return 0;
    12. }

    用Dev-C++编译运行之:

    c++设置域宽

    用于存放输出数据的宽度称为“域宽”。浮点数的域宽包含小数点。

    如果所需的宽度比设置的域宽小,空位用填充字符填充。如果显示数据所需的宽度比设置的域宽大,系统输出所有位。域宽设置仅对下一行流读入或流插入操作有效,在一次操作完后被置0。

    指定输入域宽示例源码:

    1. #include
    2. using namespace std;
    3. main ()
    4. {
    5. char str[20],str2[20];
    6. cout << "请输入一段文本: ";
    7. cin.width(5);
    8. cin>>str; //cin>>str;实际只能提取4个字符,str最后一个是空字符,其他的放在流中等待接受。
    9. cout<
    10. cin>>str2;
    11. cout<
    12. return 0;
    13. }

    用Dev-C++编译运行之:

    指定输出域宽示例源码:

    1. #include
    2. using namespace std;
    3. main ()
    4. {
    5. cout<<"abc123"<
    6. cout.width(10);
    7. cout<<"abc123"<
    8. cout<<1.2345<
    9. cout.width(10);
    10. cout<<1.2345<
    11. return 0;
    12. }

    用Dev-C++编译运行之:

    cin与cout都可以指定域宽。上面的例子是用iostream库的cin.width函数成员指定输入域宽,cout.width函数成员指定输出域宽。

    也可以iomanip库setw指定输入和输出域宽。

    用iomanip库的setw函数指定输入和输出域宽需要加入头文件#include,源码如下:

    1. #include
    2. #include
    3. using namespace std;
    4. main ()
    5. {
    6. char d[10];
    7. cout<<"Please enter a text:";
    8. cin>>setw(5);
    9. cin>>d;
    10. cout <<setw(8);
    11. cout<
    12. return 0;
    13. }

    用Dev-C++编译运行之:

     关于iomanip库 https://cplusplus.com/reference/iomanip/
    https://www.yiibai.com/cpp_standard_library/iomanip.html

    Iomanip库简介如下 

    编号

    方法和描述

    1

    setiosflags - 它用于设置格式标志。

    2

    resetiosflags - 用于重置格式标志。

    3

    setbase - 它用于设置basefield标志。

    4

    setfill - 它用于设置填充字符

    5

    setprecision - 它用于设置小数精度。

    6

    setw - 它用于设置字段宽度。

             控   制   符                    

            作           用                                     

     dec 

     设置整数为十进制

     hex

     设置整数为十六进制

     oct

     设置整数为八进制

     setbase(n)

     设置整数为n进制(n=8,10,16)

     setfill(n)

     设置字符填充,c可以是字符常或字符变量

     setprecision(n)

     设置浮点数的有效数字为n位

     setw(n)

     设置字段宽度为n位

     setiosflags(ios::fixed)

     设置浮点数以固定的小数位数显示

     setiosflags(ios::scientific)  

     设置浮点数以科学计数法表示

     setiosflags(ios::left)

     输出左对齐

     setiosflags(ios::right)

     输出右对齐

     setiosflags(ios::skipws)

     忽略前导空格

     setiosflags(ios::uppercase)

     在以科学计数法输出E与十六进制输出X以大写输出,否则小写。

     setiosflags(ios::showpos)

     输出正数时显示"+"号

     setiosflags(ios::showpoint)

     强制显示小数点

     resetiosflags() 

     终止已经设置的输出格式状态,在括号中应指定内容

    下面给出示例

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. // 前缀0表示八进制 前缀0x表示十六进制 不带前缀表示十进制
    7. int a = 123;
    8. double pi = 22.0/7.0;
    9. // setbase(n) 设置整数为n进制(n=8,10,16)
    10. // oct 八进制 dec 十进制 hex 十六进制
    11. // setiosflags(ios::showbase) 显示进制的前缀
    12. // 数值默认十进制显示输出
    13. cout << a << endl;
    14. cout << "oct: " << showbase << setbase(8) << a << " " << oct << a << endl;
    15. cout << "dec: " << showbase << setbase(10) << a << " " << dec << a << endl;
    16. cout << "hex: " << showbase << setbase(16) << a << " " << hex << a << endl;
    17. // setprecision(n) 设置浮点数的有效数字为n位
    18. // 有效位数默认是6位,即setprecision(6),即小数点前面和小数点后面加起来的位数为6个有效数字(注意会四舍五入)
    19. cout << pi << endl;
    20. cout << setprecision(12) << pi << endl;
    21. // setfill(n) 设置字符填充,c可以是字符常或字符变量
    22. // setw(n) 设置字段宽度为n位, 若是实际宽度大于被设置的,则setw函数此时失效, 只针对其后的第一个输出项有效
    23. // setiosflags(ios::left) 输出左对齐
    24. // setiosflags(ios::right) 输出右对齐 默认右对齐
    25. cout << setfill('*') << setw(20) << setprecision(12) << pi << endl;
    26. cout << setfill('*') << setw(20) << setprecision(12) << right << pi << endl;
    27. cout << setfill('*') << setw(20) << setprecision(12) << left << pi << endl;
    28. // setiosflags(ios::fixed) 设置浮点数以固定的小数位数显示
    29. cout << fixed << setprecision(12) << pi << endl;
    30. // setiosflags(ios::scientific) 设置浮点数以科学计数法表示 科学计数法输出E与十六进制输出默认是以小写的,要换成大写需添加uppercase
    31. cout << scientific << setprecision(12) << pi << endl;
    32. cout << scientific << uppercase << setprecision(12) << pi << endl;
    33. // resetiosflags() 终止已经设置的输出格式状态,在括号中应指定内容
    34. cout << setiosflags(ios::scientific) << setprecision(12) << pi << " " << resetiosflags(ios::scientific) << pi << endl;
    35. return 0;
    36. }

    用Dev-C++编译运行之:

    附录、C++学习资源
    C++ [中文] https://runebook.dev/zh-CN/docs/cpp/-index-
    https://cplusplus.com/reference/

  • 相关阅读:
    「建模学习」听说3D建模很难,原来不是学不会,而是缺少这个
    Java 写个注解并使用
    预测房屋价格(使用SGDRegressor随机梯度下降回归)
    鸿蒙HarmonyOS应用开发:多码识别
    墙面想贴好墙布,这些方法指南一定要看~好佳居窗帘十大品牌
    计算机网络 2.3数据交换技术
    使用docker部署mysql8.0+zabbix5.0
    ES6 新特性:Class 的基本语法
    好看的货架效果(含3D效果)
    vue/composition-api 的使用
  • 原文地址:https://blog.csdn.net/cnds123/article/details/126358415