当前位置: 首页 > news >正文

【和春笋一起学C++】文本输入与读取

前言:前面学习了while语句后,下面用while语句实现一个重要的功能,逐字符的读取键盘输入的字符序列,并输出到显示屏上。

准备知识:

C++的输入输出包含以下3方面的内容:

  1. 对系统指定的标准设备的输入和输出。即从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称标准I/O。
  2. 以外存为对象进行输入和输出。例如从磁盘文件输入数据,数据再输出到磁盘文件。以外存文件为对象的输入输出称为文件的输入输出,简称文件I/O。
  3. 对内存中指定的空间进行输入和输出。通常指定一个字符数组作为存储空间(实际上可以利用该空间存储任何信息)。这种输入输出称为字符串输入输出,简称串I/O。

目录

1. 方法一

2. 方法二

3. 方法三

4. 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. 方法三

还可以使用带参数的get成员函数:

#include <iostream>
#include <cstring>
using namespace std;
int main()
{int count = 0;cout << "Enter characters, enter # to quit: \n";char ch;cin.get(ch);while (ch != '#'){cout << ch;count++;cin.get(ch);}cout << endl << count << " characters read\n";return 0;
}

4. 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

使用带参数的get函数更符合对象方式,一方面因为其返回值是istream对象,意味着可以将它们拼接起来使用,另一方面还可以通过返回值判断字符读取是否成功。如将字符串"game"4个字符分别赋值给四个字符变量:ch1,ch2,ch3,ch4。可以用如下形式实现:

#include <iostream>
#include <cstring>
using namespace std;
int main()
{int count = 0;cout << "Enter characters, enter # to quit: \n";char ch1, ch2, ch3, ch4;cin.get(ch1).get(ch2).get(ch3).get(ch4);cout << "ch1="<<ch1 << "\n" << "ch2=" << ch2 << "\n" <<"ch3=" << ch3 << "\n" << "ch4=" << ch4 << "\n" << endl;return 0;
}

输出如下: 

 

http://www.lryc.cn/news/511080.html

相关文章:

  • D类音频应用EMI管理
  • 第N8周:使用Word2vec实现文本分类
  • 100天精通Python(爬虫篇)——第113天:爬虫基础模块之urllib详细教程大全
  • 光谱相机与普通相机的区别
  • Mysql数据 新增、修改和删除操作时,这些变化如何被转换为Kafka消息?
  • 《Python 机器视觉:开启智能视觉新时代》
  • uniapp实现为微信小程序扫一扫的功能
  • 【微信小程序】4plus|搜索框-历史搜索 | 我的咖啡店-综合实训
  • 使用FFmpeg进行拉流和推流操作
  • Unity微信小游戏接入开放数据域
  • Spring Boot的开发工具(DevTools)模块中的热更新特性导致的问题
  • Elasticsearch安装和数据迁移
  • Numpy指南:解锁Python多维数组与矩阵运算(下)
  • 路由器刷机TP-Link tp-link-WDR5660 路由器升级宽带速度
  • VB.NET在 Excel 二次开发中的全面应用
  • uni-app使用组件button遇到的问题
  • 如何在Express.js中处理异常情况?
  • CKA认证 | Day7 K8s存储
  • ArcGIS Pro地形图四至角图经纬度标注与格网标注
  • 策略模式以及优化
  • linux自动化一键批量检查主机端口
  • Vue3入门(9)
  • 《人工智能如何加速药物研发进程:从新药发现到临床试验的突破》
  • “鼎和财险一体化数据安全管控实践”入选信通院金融领域优秀案例
  • 探索多模态大语言模型(MLLMs)的推理能力
  • 72 mysql 的客户端和服务器交互 returnGeneratedKeys
  • 【连续学习之SSL算法】2018年论文Selfless sequential learning
  • 【蓝桥杯——物联网设计与开发】拓展模块5 - 光敏/热释电模块
  • 数字IC后端设计实现十大精华主题分享
  • 高质量配音如何影响游戏的受欢迎度