【和春笋一起学C++】文本输入与读取
前言:前面学习了while语句后,下面用while语句实现一个重要的功能,逐字符的读取键盘输入的字符序列,并输出到显示屏上。
准备知识:
C++的输入输出包含以下3方面的内容:
- 对系统指定的标准设备的输入和输出。即从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称标准I/O。
- 以外存为对象进行输入和输出。例如从磁盘文件输入数据,数据再输出到磁盘文件。以外存文件为对象的输入输出称为文件的输入输出,简称文件I/O。
- 对内存中指定的空间进行输入和输出。通常指定一个字符数组作为存储空间(实际上可以利用该空间存储任何信息)。这种输入输出称为字符串输入输出,简称串I/O。
目录
1. 方法一
2. 方法二
3. iostream类的成员函数get
重载函数1:int get();
重载函数2:int get(char& ch);
cin.get(ch)与cin.get()对比
1. 方法一
使用cin对象和流提取运算符“>>”读取。
#include <iostream>
#include <cstring>
using namespace std;
int main()
{char ch;int count = 0;cout << "Enter characters, enter # to quit: \n";cin >> ch;while (ch != '#'){cout << ch;count++;cin >> ch;}cout << endl << count << " characters read\n";return 0;
}
程序分析:程序功能是逐个读取输入的文本并在遇到'#'字符时停止读取输入。结束循环的条件是最后读取的一个字符是'#',该条件通过在循环之前读取一个字符进行初始化,并在循环体结尾读取下一个字符进行更新。输出如下:
从输出结果看,程序读取到了'#'前除空格以外的所有字符,总共检测了14个字符,有4个空格被忽视了。原因在于cin读取char值时与读取其他基本类型一样,cin将忽略空格和换行符。
另外,程序为何可以输入一串字符序列,而不是单个字符,并且程序输入'#'字符后为何还可以输入字符。这是因为键盘输入的文本内容会先被cin对象存放在缓冲区,当用户按下回车键后他输入的内容才会发送给程序,当一串字符序列发送给程序后,程序再逐个字符的检测是否为'#'字符,如果是'#'字符,就退出循环并输出检测过的所有字符。
2. 方法二
使用iostream类的成员函数get()逐字符的读取字符序列可以避免方法一中忽视空格的问题。
将方法一中的代码修改如下:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{int count = 0;cout << "Enter characters, enter # to quit: \n";char ch = cin.get();while (ch != '#'){cout << ch;count++;ch = cin.get();}cout << endl << count << " characters read\n";return 0;
}
程序输出如下,可见输出结果中包含了字符序列中的空格,并且最终检测的字符数目也包含了空格。
3. iostream类的成员函数get
get函数在iostream类中有多个重载函数,本文主要介绍无参数的get函数和有一个参数的get函数。
重载函数1:int get();
无参数的get函数,cin.get()表示从指定的输入流(通常是键盘)中提取一个字符(包括空格),如果读取成功,则函数的返回值就是读入的字符,如果遇到文件结束符号(EOF),则返回EOF。
char ch;
ch = cin.get();
if (ch != EOF) {cout << "You entered: " << ch << endl;
} else {cout << "End of file reached." << endl;
}
重载函数2:int get(char& ch);
有1个参数的get函数,其形参是char类型的引用。cin.get(ch)表示从输入流中读取一个字符,并赋给字符变量ch,如果读取成功则函数返回非0值(true),如失败则函数返回0值(false)。cin.get(ch) 更适合用于需要明确知道读取操作是否成功的场合。
char ch;
if (cin.get(ch)) {cout << "You entered: " << ch << endl;
} else {cout << "End of file reached." << endl;
}
cin.get(ch)与cin.get()对比
属性 | cin.get(ch) | ch=cin.get() |
传递输入字符的方式 | 赋给参数ch | 将函数返回值赋给ch |
用于字符输入时函数的返回值 | istream类对象(执行bool后为true) | int类型的字符编码 |
到达EOF时函数的返回值 | istream类对象(执行bool后为false) | EOF |