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

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

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

准备知识:

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

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


http://www.mrgr.cn/news/81692.html

相关文章:

  • C# 窗体应用程序嵌套web网页,基于谷歌浏览器内核(含源码)
  • 数据库基础知识---以MySQL为例
  • 【火猫DOTA2】VP一号位透露队伍不会保留原阵容
  • redis cluster集群
  • 【再谈设计模式】享元模式~对象共享的优化妙手
  • Jenkins介绍
  • C# 修改项目类型 应用程序程序改类库
  • 【CSS in Depth 2 精译_094】16.2:CSS 变换在动效中的应用(下)——导航菜单的文本标签“飞入”特效与交错渲染效果的实现
  • CMake技术细节:解决未定义,提供参数
  • 走进人工智能体
  • 【Go】context标准库
  • SpringMVC学习(二)——RESTful API、拦截器、异常处理、数据类型转换
  • esp32学习:用虫洞ESP32S3-EYE开发板快速实现USB摄像头(UVC免驱)
  • 【HENU】河南大学计院2024 计算机网络 期末复习知识点
  • 中关村科金智能客服机器人如何解决客户个性化需求与标准化服务之间的矛盾?
  • Windows 11 中利用 WSL - Linux 虚拟环境部署 ChatTTS-Enhanced 项目教程
  • 动态规划<四> 回文串问题(含对应LeetcodeOJ题)
  • 动态规划<五> 子数组问题(含对应LeetcodeOJ题)
  • PaddleOCR训练自己的私有数据集(包括标注、制作数据集、训练及应用)
  • 学习笔记(C#基础书籍)-- C#高级应用
  • WEB UI 创建视图
  • 存储过程实现多个分类不同计算规则得到对应的分类、月份和款号
  • 任务8 数据库服务配置与管理
  • C#学习1:初接触,C#的一些基础,和相关报错
  • TrackZone:使用Ultralytics YOLO11在区域内进行对象跟踪
  • 华为麦芒5(安卓6)termux记录 使用ddns-go,alist