C++ cin的使用,看这一篇就够了

本文详细介绍了C++ cin的用法,包括流的概念、输入输出管理、缓冲区原理、关键类的功能,以及C++11新特性。涵盖了cin与指针、类型转换、错误检查、流状态控制和异常处理等内容,适合初学者和进阶者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++ cin的用法,看这一篇就够了

1 C++输入输出综述

C++ IO首先建立在为Unix环境开发的原始库函数上;ANSI C正式承认这个库时,将其称为标准输入/输出包;
IO相关类定义在头文件iostream和fstream,这些类不是正式语言定义的组成部分,cin,istream都不是关键字。

1.1 流和缓冲

(1)流简介:

  • C++程序将输入和输出看作字符流;对于输入来说,程序从输入流中抽取字符,对于输出来说,程序向输出流中插入字符;
  • 输入流可以来自键盘、存储设备或者其他程序;输出流可以输出至显示器、打印机、存储设备或者其他程序。
  • 流是程序与流源或流目的之间的中介,这样C++就可以对来源不同的字符做相同处理。

(2)管理输入:

  • 两个阶段:将流与程序绑定在一起,将流与源绑定在一起

(3)管理输出:

  • 两个阶段:将流与目的绑定在一起,将流与程序绑定在一起

(4)缓冲区简介

缓冲区就是一块存储空间,它是为了匹配程序处理速度和外设处理速度;比如程序一次处理1byte,但是磁盘一次读取512bytes;又或者程序一次处理1byte,可以1byte地从磁盘读取,但是由于硬件读取一次数据复杂且操作慢,因此使用缓冲区可以加快程序处理速度。

flushing the buffer:刷新缓冲区就是清空缓冲区地内容以备下次使用。

1.2 输入输出中比较重要的类

  • streambuf:提供缓冲区,有成员方法 填满缓冲区、获取缓冲区内容、刷新缓冲区、管理缓冲区
  • ios_base:表示流的一般属性 比如文件是否打开、是二进制流还是文本流等等
  • ios:基于ios_base,并且它包含了一个指针成员指向一个streambuf对象
  • ostream:继承自ios类并提供了输出方法
  • istream:继承自ios类并提供了输入方法
  • iostream:继承自ostream类和istream类

1.3 C++11 I/O新特性

  • ostream.h转换为ostream,将ostream类放置到std命名空间中
  • I/O类被重写,开发了I/O类模板包括basic_istream<charT,traits>和basic_ostream<charT, traits>。实现了char,wchar_t具体化;istream和ostream是char的具体化,cout输出字符流,wistream和wstream是wchar_t的具体化,wcout用于输出宽字符流。
  • ios基类中的一些独立与类型的信息被移动到ios_base类中,比如格式化常量ios::fixed变为ios_base::fixed,还新增了一些常量

1.4 包含iostream头文件时会自动创建八个流对象(4个用于窄字符流,4个用于宽字符流)

  • cin对象:对应标准输入流,默认情况下这个流与标准输入设备匹配(键盘);wcin对象用于wchar_t类型;
  • cout对象:对应标准输出流,默认情况下这个流与标准输出设备匹配(显示器),借助streambuf管理流;wcout对象用于wchar_t类型;
  • cerr对象:对应于标准错误流(可以用于显示错误信息),默认情况下这个流与标准输出设备匹配(显示器),这个流是不缓冲的;wcerr对象用于wchar_t类型;不受重定向的影响,即使重定向了输入输出流,错误信息还是打印到显示器上
  • clog对象:对应于标准错误流,默认情况下这个流与标准输出设备匹配(显示器),这个流是缓冲的;wclog对象用于wchar_t类型。不受重定向的影响,即使重定向了输入输出流,错误信息还是打印到显示器上

1.4 重定向

修改标准输入和标准输出关联的工具。

  • 输出到文件,而不是显示器
  • 允许用文件替换键盘输入
  • Windows允许通过键盘模拟文件尾:Ctrl+Z

2 cin的使用

C++在输入时将数据看作字符流。istream类提供了一个可以将istream对象(如cin)转换为bool值的函数,当cin出现在需要bool类型的地方(如在while循环测试条件中),该转换函数将被调用;如果读取成功,转换为true,如果读取失败,转换为false。

2.1 cin自动类型转换

istream类,定在文件为iostream头文件,为以下数据类型重载了>>抽取操作符,所重载的函数称为格式化输入函数。
signed char &、unsigned char &、char &、short &、unsigned short &、int &、unsigned int &、long &、unsigned long &、long long & (C++11)、unsigned long long & (C++11)、float &、double &、long double &
成员函数原型为:

istream & operator>>(type &);//type为以上数据类型
//这些函数被称为格式化输入函数,函数可以将输入的字符串转换为type格式

2.2 cin与指针

istream类,定在文件为iostream头文件,为以下指针类型重载了>>抽取操作符,
signed char *、char *、unsigned char *
成员函数原型为:

istream & operator>>(type &);//type为以上数据类型
//函数使得cin的字符流存储到指针指向的存储地址。

举例:

cout << "cin与指针******************************************************************************" << endl;
char ceshi[20];
cout << "请输入姓名:" << endl;
cin >> ceshi;
cout << "您的姓名是:" << ceshi << endl;

运行结果:

cin与指针******************************************************************************
请输入姓名:
Jasmine
您的姓名是:Jasmine

2.3 cin如何检查输入

cout略过空白符(空白、新行、tabs)直到它遇到非空白符。

对于一个变量,cin>>读取的是从非空白字符开始,到与目标类型不匹配的第一个字符之间的全部内容;不匹配的内容将被保存在输入缓冲流中,等待下一次输入。

2.3.1 非数字终止循环

当然这个(cin检查输入)也还有用武之地,可以被放在循环条件中来终止循环。(需要注意的是,循环终止后不再允许用户输入,即使调用cin>>也没用;如需要用户输入,则需要设置标识符为有效才可)如下例子:

举例:

// File name:           cinfish.cpp
// Last modified Date:  2021年11月21日11点28分
// Last Version:        V1.0
// Descriptions:        非数字输入终止循环
// cinfish.cpp -- non-numeric input terminates loop
#include <iostream>
const int Max = 5;
int main()
{
   
	using namespace std;
	// get data
	double fish[Max];
	char x;
	cout << "Please enter the weights of your fish.\n";
	cout << "You may enter up to " << Max
		<< " fish <q to terminate>.\n";
	cout << "fish #1: ";
	int i = 0;
	while (i < Max && cin >> fish[i]) {
   //在这里,如果输入为字符,那么第二个条件会为0,将不会再执行循环体的内容
		if (++i < Max)
			cout << "fish #" << i + 1 << ": ";
	}
	// calculate average
	double total = 0.0;
	for (int j = 0; j < i; j++)
		total += fish[j];
	// report results
	if (i == 0)
		cout << "No fish\n";
	else
		cout << total / i << " = average weight of "
		<< i << " fish\n";
	cout << "Done.\n";

	//如果再需要输入的话
	cin.clear(); // reset input 如果没有这一句的话,后面就直接运行完成,不会请求用户输入
	//这一句是吃掉结束循环的那个字符
	cin.get();
	//这一句是吃掉那个结束字符后面的回车
	cin.get();
	cout << "请输入一个测试字符:";
	x = cin.get();
	cout << x<<endl;
	return 0;
}

运行结果:

Please enter the weights of your fish.
You may enter up to 5 fish <q to terminate>.
fish #1: 2.9
fish #2: a
2.9 = average weight of 1 fish
Done.
请输入一个测试字符:r
r

D:\Prj\C++\C++_Learning\cinfish_cin_Input_inspection\Debug\cinfish_cin_Input_inspection.exe (进程 14760)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

2.3.2 用户输入检查

如果用户输入与变量类型不匹配,就提示用户输入类型匹配的数据并处理掉那些不匹配的数据。

代码:

// File name:           user_Input_inspection
// Last modified Date:  2021年11月21日11点33分
// Last Version:        V1.0
// Descriptions:        用户输入检查

// cingolf.cpp -- non-numeric input skipped
#include <iostream>
const int Max = 5;
int main()
{
   
	using namespace std;
	// get data
	int golf[Max];
	cout << "Please enter your golf scores.\n";
	cout << "You must enter " << Max << " rounds.\n";
	int i;

	for (i = 0; i < Max; i++)
	{
   
		cout << "round #" << i + 1 << ": ";
		//**************************用户输入检查的核心部分开始**************************//
		while (!(cin >> golf[i])) {
   //如果输入类型不匹配,则执行循环体
			cin.clear(); // reset input设置标志位为有效
			while (cin.get() != '\n')  //删除没有用的输入
				continue; // get rid of bad input
			cout << "Please enter a number: ";
		}
		//**************************用户输入检查的核心部分结束**************************//
	}
	// calculate average
	double total = 0.0;
	for (i = 0; i < Max; i++)
		total += golf[i];
	// report results
	cout << total / Max << 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jasmine-Lily

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值