c++中的iostream

c++标准库中定义的IO类型有:

头文件:iostream iostream定义了用于读写流的基本类型。
头文件:fstream fstream定义了用于读写命名文件的类型。
头文件:sstream stream定义了读写内存string对象的类型。

iostream类

iostream将流数据视为一个字节接一个字节的流。如果流的目标是文件或者控制台屏幕,数据源通常是程序的一部分。如果流的方向与此相反,数据将来自键盘或磁盘文件并流入到数据变量中。
ios类是输入流和输出流的基类,其中有个成员变量为streambuf类对象。
streambuf类用于管理缓冲区,可以填充、清空、刷新和处理缓冲区的其他功能。##

如果程序中包含了iostream头文件,那么程序启动过程中会创建并且初始化4个对象。分别如下:

cin:处理标准输入设备的输入。一般指键盘输入。
cout:处理标准输出设备的输出。一般只控制台屏幕。
cerr:处理标准错误设备的输出。cerr比较特殊,每次用cerr输出的数据都不需要缓冲,会直接输出到控制台屏幕。
clog:处理输出到标准错误设备的错误信息。clog的输出是缓冲形式的,不会立即写到控制台屏幕。

cin和cout用法比较简单,这里只介绍cin中的一些函数:
//不接受任何参数,返回找到的字符值;如果文件达到文件末尾则返回EOF
cin.get();


//接收一个char类型的引用,返回一个istream对象                   
cin.get(char &_ch);


//接收一个char类型数组,该数据存放数据,第二个参数是要读取的最大字符数量加1;      
cin.get(char *str,StreamSize size+1);


//增加了最后一个参数,表示结束字符,如果提取字符过程中还没有到达最大长度就遇到结束字符,则结束提取过程
cin.get(char* str,StreamSize size,char termChar); 


//该函数就是从控制台屏幕读取一整行数据放置字符数组中,size表示最大字符数;    
cin.getline(char *str,StreamSize size); 


 //增加了终止字符,其余参数和上一个函数相同 
cin.getline(char* str,StreamSize size,char termChar); 


//忽略缓冲区中的_Count个字符直到遇到termChar为止
cin.ignore(StreamSize _Count,char termChar);  
- 注:
  1. StreamSize 参数大小之所以是最大字符数量加1是因为读取了响应长度的字符之后,还需要在该字符数据末尾加上空字符表示字符串结束标志。
  2. 在遇到结束字符termchar后,不会读取termchar字符,而是直接在字符数组末尾添加空字符
  3. 带参数的get()函数其返回值全部都是istream对象而cin.getline()两个版本函数都返回istream对象
  4. 带参数的cin.get()和cin.getline()相比较,cin.get()在读取数据中遇到终止符会结束提取,不会提取终止符,终止符最终还是留在输入缓冲区。而getline()会提取终止符,并且提取之后没有放入我们存储数据的字符数组而是立即丢弃它。
下面用段代码篇说明,有兴趣的话可以复制到编译器中亲自尝试一下。
using namespace std;
int main()
{
    //两个字符数组存储从控制台读取的数据
    char stringOne[255];                        
    char stringTwo[255];

    //读取数据至stringOne,注意采用了get函数,get函数会将换行符'\n'丢弃在缓冲区
    cout << "Enter string one:";
        cin.get(stringOne, 255);
    cout << "string One:" << stringOne << endl;

    /*读取数据至stringTwo,因为缓冲区中现在剩下一个换行符'\n'
    getline()函数直接读取到了换行符'\n',不需要用户输入,直接返回
    根据已知的知识得知getline()读取到换行符'\n'之后直接丢弃换行符,
    因此stringTwo为空
    */
    cout << "Enter String Two";
    cin.getline(stringTwo, 255);

    //会注意到stringtwo不等输入,直接输出
    cout << "String two:" << stringTwo << endl;
    cout << "Now let use ignore function" << endl << endl << endl;


    //这一次和上一次的操作一模一样,只是采用了cin.ignore()函数
    cout << "Enter string one:";
        cin.get(stringOne, 255);
    cout << "StringOne:" << stringOne << endl;
    cout <<"Enter string two:";


    //调用cin.ignore()函数直接忽略掉缓冲区中的换行符'\n',
    //忽略换行符'\n'缓冲区为空,于是等待输入
    cin.ignore(255, '\n');
    cin.getline(stringTwo, 255);
    cout << "stringTwo:" << stringTwo << endl;


    //下面这个例子告诉我们ignore()函数中两个条件,只要一个到达要求就会停止忽略
    char stringThree[10];
    char stringFour[10];
    /*
        如果你输入 Open with Code
        cin.get()函数读取到的是Ope,因为get函数中streamSize是读取到的最大字符数+1个换行符
        cin.getline()函数读取到的是with Code
    */
    cout << "请输入一段英文句子,句子中至少有8个字母"<<endl;
    cin.get(stringThree, 4, '\n');
    cout << "StringThree中的数据是:"<<stringThree << endl;
    //系统忽略2个字母,即使一直没碰到换行符'\n',系统也只会忽略两个字母
    cin.ignore(2, '\n');
    cin.getline(stringFour, 255);
    cout <<"stringFour中的数据是"<< stringFour<<endl;
    return 0;
}
以下代码片段明确的标明了cin>>和cin.get()的返回值的区别。
int a;
double b;
string c;
char d;
cin>>a>>b>>c>>d;//正确,cin>>之后返回一个istream对象,可以继续提取数据
cin.get()>>a>>b>>c>>d;//错误,cin.get()返回值不是istream对象,不能级联式的提取

To be continued…

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++,头文件<iostream>定义了标准输入/输出流对象。包含了<iostream>也自动包含了<ios>、<streambuf>、<istream>、<ostream>和<iosfwd>。\[1\]预定义的对象cout是iostream类的一个实例。cout对象"连接"到标准输出设备,通常是显示屏。cout是与流插入运算符 << 结合使用的。\[2\]C++的源文件名的常用扩展名有.cpp、.cxx、.cc、.c、.c++,头文件有.hpp、.hxx、.h。由此可见C++是一个C的超集,C++完全兼收了C的语法特性和标准库,所以C++编译器完全可以正常编译一个C程序。\[3\] #### 引用[.reference_title] - *1* [C++头文件iostream介绍](https://blog.csdn.net/fengbingchun/article/details/63685373)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [iostream类 - C++输入输出(一)](https://blog.csdn.net/u012294613/article/details/124574427)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [c++标准库iostream](https://blog.csdn.net/m0_60073820/article/details/121319269)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值