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

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 << " = average score "
		<< Max << " rounds\n";
	return 0;
}

运行结果:

Please enter your golf scores.
You must enter 5 rounds.
round #1: 5
round #2: 6
round #3: 7
round #4: 88
round #5: a
Please enter a number: 19
25 = average score 5 rounds

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

2.4 流状态

流状态被定义为iostate,是由三个ios_base组成:eofbit,badbit,和failbit,三者都为一位可以设置位1(设置)或0(清除)。当三者都为0时说明一切顺利。

成员 描述
eofbit 当读取文件到达文件尾时置为1
failbit 当输入流中的数据类型和目的数据类型不一致时置为1;I/O错误(读取一个不允许访问的只读磁盘)时置为1
badbit 在一些无法诊断的失败破坏流时置为1
goodbit 另一种说明0的方法
good() 如果流可以使用,则返回true,反之返回false
eof() 如果eofbit被设置,则返回true,反之返回false
bad() 如果badbit被设置,则返回true,反之返回false
fail() 如果failbit或badbit被设置,返回true,反之返回false
rdstate() 返回流状态
exceptions() 返回一个位掩码,指出哪些标记导致异常被引发
exceptions(iostate ex) 设置哪些状态将导致clear()引发异常
clear(iostate s) 将流状态设置为s,s的默认值为0;如果rdstate() & exceptions()) != 0,将抛出basic_ios::failure异常;将会设置s,但是其他的会被置0
setstate (iostate s) 调用clear(rdstate()|s)。这将设置与s中设置的位对应的流的状态位,其他流状态保持不变。

2.4.1 设置状态

setstate()的主要目的是提供一种修改状态的途径。例如,如果num是一个int,则下面的调用将可能导致operator>>(int &)使用setstate()设置failbit或eofbit。

clear();//清除所有的位
clear(eofbit);//清楚指定的位
setstate(eofbit);//设置指定的位
//等等

2.4.2 I/O和异常

exceptions()返回一个位字段,它包含3位,分别对应于eofbit,failbit,and badbit。

修改流状态后,clear()方法将当前的流状态与exceptions()返回的值进行比较;如果两者的某一对应位都被设置,则clear()将会引发ios_base::failure异常。

举例:

举例:

cout << "流状态********************************************************************************" << endl;
cout << "异常:" << endl;
// have failbit cause an exception to be thrown
cin.exceptions(ios_base::failbit);
cout << "Enter numbers: ";
int sum = 0;
int input;
try {
    while (cin >> input)
    {
        sum += input;
    }
}
catch (ios_base::failure& bf)
{
    cout << bf.what() << endl;
    cout << "O! the horror!\n";
}
cout << "Last value entered = " << input << endl;
cout << "Sum = " << sum << endl;

运行结果:

流状态********************************************************************************
异常:*****************************************
Enter numbers: 99 88 q
ios_base::failbit set: iostream stream error
O! the horror!
Last value entered = 88
Sum = 187

2.4.3 解除输入挂起

上述例子中引发了异常,那么在执行上述代码之后,后面的cin被挂起。

根本原因在于,在设置流状态之后有个很重要的结果:流被关闭了,错误的输入被存储在输入缓冲区,直到所有的位被cleared之后才能重新打开流。

因此,在引发类型不匹配异常后需要以下两步:

​ 1.重置流状态

​ 2.清空输入缓冲区

举例:接着2.4.2的例子

cout << "解除输入挂起:***********************************" << endl;
//cin >> sum;//将失败因为输入被挂起了
//执行下述代码后,就可以重新输入
if (cin.fail() && !cin.eof()) //排除掉是读到end-of-file的可能
{
    cout << "输入类型不匹配问题,正在重置cin~" << endl;
    cin.clear(); // reset stream state
    while (!isspace(cin.get()))  //or while (cin.get() != '\n')
    	continue; //删除输入流中滞留的数据
    cout << "重置cin完成~" << endl;
}
else // else bail out
{
    cout << "I cannot go on!\n";
    exit(1);
}
cout << "Now enter a new number: ";
cin >> input; // will work now
cout << "您输入的数据为:" << input << endl;

运行结果:

解除输入挂起:***********************************
输入类型不匹配问题,正在重置cin~
重置cin完成~
Now enter a new number: 99
您输入的数据为:99

2.4.4 文件尾EOF

文件尾 EOF
如果输入来自于文件:使用文件尾(EOF)判断文件是否读完。
当检测到EOF之后:cin将eofbit和failbit都设置为1;同时,将设置cin对象中的一个指示EOF条件的标记,设置这个标记后,cin将不读取输入,直到cin.clear()。
EOF被定义为值为-1,因此不能将EOF赋给char类型,因为char类型没有符号,需要使用int类型接收EOF。

举例:Windows允许通过键盘模拟文件尾:Ctrl+Z

cout << "文件尾 EOF**************************************" << endl;
cout << "请输入字符串,EOF结尾~:" ;	
int count = 0;
int chx;//不能使用char接受,因为EOF被设置为-1
while ((chx = cin.get()) != EOF) // test for end-of-file
{
    cout.put(char(chx));
    ++count;
    if (count == 5)
        break;
}
cout << endl << count << " characters read\n";
cin.clear();
while (cin.get() != '\n');

运行结果:

文件尾 EOF**************************************
请输入字符串,EOF结尾~:
klaisjjsdj^Z
klai
5 characters read

2.5 面向字符的输入

2.5.1 cin.get(char &)

  • 读取一个字符并存储到实参中。
  • 是一个非格式化函数,不会越过空白、新行、tab字符输入。
  • 返回值为cin,因此可以级联输入。
  • 注意事项:istream类提供了一个可以将istream对象(如cin)转换为bool值的函数,当cin出现在需要bool类型的地方(如在while循环测试条件中),该转换函数将被调用;如果读取成功,转换为true,如果读取失败,转换为false。

原型:

basic_istream<charT,traits>& get(char &);

举例:

cout << "cin.get(char)*****************************************************************************" << endl;
int ct = 0;
char ch;
cout << "请输入内容:" << endl;
while (cin.get() != '\n');
cin.get(ch);
while (ch != '\n')
{
    cout << ch;
    ct++;
    cin.get(ch);
}
cout << "您输入了"<<ct <<"字母"<< endl;

运行结果:

cin.get(char)*****************************************************************************
请输入内容:
liaiajj ssdsmaka
liaiajj ssdsmaka
您输入了16字母

2.5.2 cin.get(void)

本函数主要是为了兼容C语言,通过包含iostream(而不是stdio.h),并用cin.get()替换所有的getchar(),用cin.put(ch)替换所有的putchar(ch),以此来将C程序转换为C++程序。

函数原型:

int get(void);

cin.get(void)特点

  • 读取一个字符并返回
  • 是一个非格式化函数,不会越过空白、新行、tab字符输入
  • 返回值为int,因此不支持级联输入
  • 注意事项:当输入失败时返回EOF(EOF可能不是正整数,因此如果要检查EOF不能使用char接收返回值。)

举例:

cout << "cin.get()********************************************************************************" << endl;
cout << "吃掉回车符cin.get()**********************************" << endl;
char test1[30];
cout << "输入字符串1:";
cin >> test1;
while (cin.get() != '\n');//只有加上了这句,ch才可以正常读取,否则ch会读取为输入test1后的回车符。
cout << "输入单个字符:***************************************"<<endl;
ch = cin.get();
while (cin.get() != '\n');
cout << "您输入的字符为:";
cout.put(ch);
cout << endl;

运行结果:

cin.get()********************************************************************************
吃掉回车符cin.get()**********************************
输入字符串1:kia
输入单个字符:***************************************
a
您输入的字符为:a

2.5.3 cin.get(ch)与cin.get()

属性 cin.get(ch) ch = cin.get()
传递输入字符的方式 赋给参数ch ch = cin.get()
用于字符输入时函数的返回值 istream对象(执行bool转换为true) int类型的字符编码
到达EOF时函数的返回值 istream对象(执行bool转换为false) EOF

2.6 面向行的输入

2.6.1 getline() 、get()与ignore()

getline() 、get()函数原型:

istream & get(char *, int, char);//VS2022说没有与参数列表匹配的重载函数
istream & get(char *, int);
istream & getline(char *, char);//VS2020说没有与参数列表匹配的重载函数
istream & getline(char *, int);

说明:第一个参数指定读取数据的存储位置首地址;第二个参数等于大于最大可读取字符总数+1(留一个位置给’\0’);第三个参数是一个分隔符,只有两个参数的函数的分隔符为换行符。

注意:getline() 与get()最大的不同在于getline() 会从输入流中抽取并丢弃分隔符(换行符),但是get()会将分隔符留在输入流中但作为下一个读取的开始。

ignore()函数原型:

istream & ignore(int = 1, int = EOF);

说明:第一个参数指定最大读取字符数量,第二个参数指定间隔符;该函数至多丢弃最大字符数量的字符,遇到间隔符则终止丢弃。

举例:

cout << "面向行的输入*****************************************************************************" << endl;
cout << "getline() 、get()与ignore()*********************" << endl;
/*5 cin面向行的输入*/
/*方法1 cin.getline()*/
cout << "cin.getline()*****************************************" << endl;
const int ArSize = 20;
char name[ArSize];
char dessert[ArSize];
char name1[ArSize];
char dessert2[ArSize];
cout << "getline() test" << "\n";
cout << "Enter your name:";
cin.getline(name, ArSize);//cin.getline()会主动吃掉字符串输入最后的回车符,因此不需加上get()吃掉回车符
cout << "Enter your favorite dessert:";
cin.getline(dessert, ArSize);
cout << "I have some delicious " << dessert;
cout << " for you," << name << ".\n" << endl;

/*方法2 cin.get()*/
cout << "cin.get()*********************************************" << endl;
cout << "get() test" << "\n";
cout << "Enter your name:";
cin.get(name, ArSize).get();//cin.get()不会主动吃掉字符串输入最后的回车符,因此需要加上get()吃掉回车符
cout << "Enter your favorite dessert:";
cin.get(dessert, ArSize).get();
cout << "I have some delicious " << dessert;
cout << " for you," << name << ".\n" << endl;

/*ignore()*/
cout << "ignore()**********************************" << endl;
cout << "请输入内容(字符串+空格+字符串):";
cin.get(ch);
cout << "输入字符为:" << ch << endl;
cout << "丢弃字符前,下一个字符为:" << char(cin.peek()) << endl;//peek()为查看下一个字符但是不抽取,依然留在输入流中
if (ch != ' ')
    cin.ignore(9, ' '); // discard rest of line
cout << "丢弃字符后,下一个字符为:" << char(cin.peek()) << endl;
while (cin.get() != '\n');

运行结果:

面向行的输入*****************************************************************************
getline() 、get()与ignore()*********************
cin.getline()*****************************************
getline() test
Enter your name:lili
Enter your favorite dessert:cakes
I have some delicious cakes for you,lili.

cin.get()*********************************************
get() test
Enter your name:lalla
Enter your favorite dessert:lla
I have some delicious lla for you,lalla.

ignore()**********************************
请输入内容(字符串+空格+字符串):liaia llaajs
输入字符为:l
丢弃字符前,下一个字符为:i
丢弃字符后,下一个字符为:l

2.6.2 意外字符串输入

方法 行为
getline(char *,int) 如果没有读取任何字符(换行符视为读取了一个字符),则设置failbit
如果读取了最大数目的字符,且行中还有其他字符(非换行符),则设置failbit
get(char *,int) 如果没有读取字符,则设置failbit

get()首先查看字符数量,其次查看EOF,最后查看下一个字符是否为换行符

2.7 其他istream方法

2.7.1 read()

原型:

istream & read(char *,int);//第一个参数指定存储位置,第二个参数指定读取多少数量的字符

功能:读取指定数量的字符并将其存储到指定的位置,不添加’\0’。

应用场景:不应用于键盘输入,而是应用于ostream write()函数的文件输入和输出。

注意事项:返回值为istream,允许级联使用。

2.7.2 peek()

原型:

char peek();

作用:返回输入流的下一个输入字符,但是不抽取,peek()完之后该字符还在输入流中且位置不变。

2.7.3 gcount()

原型:

int gcount();

作用:计算上次非格式化抽取方法抽取的字符数量并返回。

注意事项:gcount()比strlen()要快哟。

2.7.4 putback()

原型:

istream &,putback(char &);

作用:向输入流中插入一个字符,这个被插入的字符将会成为下一个输入的第一个字符。

注意事项:gcount()比strlen()要快哟。

2.7.5 举例

cout << "其他istream方法************************************************************************************" << endl;
char name2[SLEN];
char title[SLEN];
cout << "Enter your name: ";
cin.get(name2, SLEN);
count = cin.gcount();//使用gcount()
cout << "刚刚读取了:" << count << "字符" << endl;
if (cin.peek() != '\n')
    cout << "Sorry,we only have enough room for "<< name2 << endl;
eatline();//吃掉这行中剩下的字符
cout << "Dear " << name2 << ",enter your title: ";
cin.get(title, SLEN);
ch = '#';
cin.putback(ch);
cin.get(ch);
cout <<  ch << " is next input character.\n";
eatline();
cout << " Name: " << name2 << "\nTitle: " << title << endl;

运行结果:

其他istream方法************************************************************************************
Enter your name: laa
刚刚读取了:3字符
Dear laa,enter your title: saa

# is next input character.
 Name: laa
Title: saa

2.8 面向string类的输入

为什么不沿用iostream库的getline() and cout方法呢?原因是string类是后来提出的,iostream库中没有处理string类的机制。

cout << "面向string类的输入*****************************************************************************" << endl;
cout << "请输入字符串:" << endl;
getline(cin, str1);//getline()是string类的一个友元函数
cout << "str1 = " << str1 << endl<<endl;//cout是string类的一个友元函数

运行结果:

面向string类的输入*****************************************************************************
请输入字符串:
iiaa
str1 = iiaa

3 完整测试代码

/*
Project name :			_6cin_usage
Last modified Date:		2022年4月26日17点39分
Last Version:			V1.0
Descriptions:			cin的常用用法
*/
#include <iostream>
#include<string>
const int SLEN = 10;
inline void eatline() { while (std::cin.get() != '\n') continue; }
const int Max = 5;
int main()
{
	using namespace std;//将命名空间std的所有名字都引用了
	cout << "cin与指针******************************************************************************" << endl;
	char ceshi[20];
	cout << "请输入姓名:" ;
	cin >> ceshi;
	cout << "您的姓名是:" << ceshi << endl;
	cout << "cin如何检查输入************************************************************************" << endl;
	int elevation;
	char getduo;
	cout << "请输入整数:" ;
	cin >> elevation;
	cout << "您输入了:" << elevation << endl;
	cout << "请输入单个字符:"<<endl;
	cin >> getduo;
	cout << "您输入的单个字符为:" << getduo<<endl;
	cout << "流状态********************************************************************************" << endl;
	cout << "异常:*****************************************" << endl;
	// have failbit cause an exception to be thrown
	cin.exceptions(ios_base::failbit);
	cout << "Enter numbers: ";
	int sum = 0;
	int input;
	try {
		while (cin >> input)
		{
			sum += input;
		}
	}
	catch (ios_base::failure& bf)
	{
		cout << bf.what() << endl;
		cout << "O! the horror!\n";
	}
	cout << "Last value entered = " << input << endl;
	cout << "Sum = " << sum << endl;
	cout << "解除输入挂起:***********************************" << endl;
	//cin >> sum;//将失败因为输入被挂起了
	//执行下述代码后,就可以重新输入
	if (cin.fail() && !cin.eof()) //排除掉是读到end-of-file的可能
	{
		cout << "输入类型不匹配问题,正在重置cin~" << endl;
		cin.clear(); // reset stream state
		while (!isspace(cin.get()))  //or while (cin.get() != '\n')
			continue; //删除输入流中滞留的数据
		cout << "重置cin完成~" << endl;
	}
	else // else bail out
	{
		cout << "I cannot go on!\n";
		exit(1);
	}
	cout << "Now enter a new number: ";
	cin >> input; // will work now
	cout << "您输入的数据为:" << input << endl;
	cout << "文件尾 EOF**************************************" << endl;
	cout << "请输入字符串,EOF结尾~:" ;	
	int count = 0;
	int chx;//不能使用char接受,因为EOF被设置为-1
	while ((chx = cin.get()) != EOF) // test for end-of-file
	{
		cout.put(char(chx));
		++count;
		if (count == 5)
			break;
	}
	cout << endl << count << " characters read\n";
	cin.clear();
	while (cin.get() != '\n');
	char ch;
	cout << "cin.get(char)*****************************************************************************" << endl;
	int ct = 0;
	cout << "请输入内容:";
	cin.get(ch);
	while (ch != '\n')
	{
		cout << ch;
		ct++;
		cin.get(ch);
	}
	cout <<endl<< "您输入了"<<ct <<"字母"<< endl;
	cout << "cin.get()********************************************************************************" << endl;
	cout << "吃掉回车符cin.get()**********************************" << endl;
	char test1[30];
	cout << "输入字符串1:";
	cin >> test1;
	while (cin.get() != '\n');//只有加上了这句,ch才可以正常读取,否则ch会读取为输入test1后的回车符。
	cout << "输入单个字符:***************************************"<<endl;
	ch = cin.get();
	while (cin.get() != '\n');
	cout << "您输入的字符为:";
	cout.put(ch);
	cout << endl;
	cout << "面向行的输入*****************************************************************************" << endl;
	cout << "getline() 、get()与ignore()*********************" << endl;
	/*5 cin面向行的输入*/
	/*方法1 cin.getline()*/
	cout << "cin.getline()*****************************************" << endl;
	const int ArSize = 20;
	char name[ArSize];
	char dessert[ArSize];
	char name1[ArSize];
	char dessert2[ArSize];
	cout << "getline() test" << "\n";
	cout << "Enter your name:";
	cin.getline(name, ArSize);//cin.getline()会主动吃掉字符串输入最后的回车符,因此不需加上get()吃掉回车符
	cout << "Enter your favorite dessert:";
	cin.getline(dessert, ArSize);
	cout << "I have some delicious " << dessert;
	cout << " for you," << name << ".\n" << endl;

	/*方法2 cin.get()*/
	cout << "cin.get()*********************************************" << endl;
	cout << "get() test" << "\n";
	cout << "Enter your name:";
	cin.get(name, ArSize).get();//cin.get()不会主动吃掉字符串输入最后的回车符,因此需要加上get()吃掉回车符
	cout << "Enter your favorite dessert:";
	cin.get(dessert, ArSize).get();
	cout << "I have some delicious " << dessert;
	cout << " for you," << name << ".\n" << endl;
	
	/*ignore()*/
	cout << "ignore()**********************************" << endl;
	cout << "请输入内容(字符串+空格+字符串):";
	cin.get(ch);
	cout << "输入字符为:" << ch << endl;
	cout << "丢弃字符前,下一个字符为:" << char(cin.peek()) << endl;
	if (ch != ' ')
		cin.ignore(9, ' '); // discard rest of line
	cout << "丢弃字符后,下一个字符为:" << char(cin.peek()) << endl;
	while (cin.get() != '\n');
	cout << "其他istream方法************************************************************************************" << endl;
	char name2[SLEN];
	char title[SLEN];
	cout << "Enter your name: ";
	cin.get(name2, SLEN);
	count = cin.gcount();//使用gcount()
	cout << "刚刚读取了:" << count << "字符" << endl;
	if (cin.peek() != '\n')
		cout << "Sorry,we only have enough room for "<< name2 << endl;
	eatline();//吃掉这行中剩下的字符
	cout << "Dear " << name2 << ",enter your title: ";
	cin.get(title, SLEN);
	ch = '#';
	cin.putback(ch);
	cin.get(ch);
	cout <<  ch << " is next input character.\n";
	eatline();
	cout << " Name: " << name2 << "\nTitle: " << title << endl;
    cout << "面向string类的输入*****************************************************************************" << endl;
	string str1;
	cout << "请输入字符串:" << endl;
	getline(cin, str1);//getline()是string类的一个友元函数
	cout << "str1 = " << str1 << endl << endl;//cout是string类的一个友元函数
	return 0;
}

原文地址:https://blog.csdn.net/weixin_44410704

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple 最新软件的错误和性能问题。
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只有5%的概率会遇到选择运营商界面且部分必须连接到iTunes才可以激活
一般在接外包的时候, 通常第三方需要安装你的app进行测试(这时候你的app肯定是还没传到app store之前)。
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应用变灰了。那么接下来我们看一下Flutter是如何实现的。Flutter中实现整个App变为灰色在Flutter中实现整个App变为灰色是非常简单的,只需要在最外层的控件上包裹ColorFiltered,用法如下:ColorFiltered(颜色过滤器)看名字就知道是增加颜色滤镜效果的,ColorFiltered( colorFilter:ColorFilter.mode(Colors.grey, BlendMode.
flutter升级/版本切换
(1)在C++11标准时,open函数的文件路径可以传char指针也可以传string指针,而在C++98标准,open函数的文件路径只能传char指针;(2)open函数的第二个参数是打开文件的模式,从函数定义可以看出,如果调用open函数时省略mode模式参数,则默认按照可读可写(ios_base:in | ios_base::out)的方式打开;(3)打开文件时的mode的模式是从内存的角度来定义的,比如:in表示可读,就是从文件读数据往内存读写;out表示可写,就是把内存数据写到文件中;
文章目录方法一:分别将图片和文字置灰UIImage转成灰度图UIColor转成灰度颜色方法二:给App整体添加灰色滤镜参考App页面置灰,本质是将彩色图像转换为灰度图像,本文提供两种方法实现,一种是App整体置灰,一种是单个页面置灰,可结合具体的业务场景使用。方法一:分别将图片和文字置灰一般情况下,App页面的颜色深度是24bit,也就是RGB各8bit;如果算上Alpha通道的话就是32bit,RGBA(或者ARGB)各8bit。灰度图像的颜色深度是8bit,这8bit表示的颜色不是彩色,而是256
领导让调研下黑(灰)白化实现方案,自己调研了两天,根据网上资料,做下记录只是学习过程中的记录,还是写作者牛逼
让学前端不再害怕英语单词(二),通过本文,可以对css,js和es6的单词进行了在逻辑上和联想上的记忆,让初学者更快的上手前端代码
用Python送你一颗跳动的爱心
在uni-app项目中实现人脸识别,既使用uni-app中的live-pusher开启摄像头,创建直播推流。通过快照截取和压缩图片,以base64格式发往后端。
商户APP调用微信提供的SDK调用微信支付模块,商户APP会跳转到微信中完成支付,支付完后跳回到商户APP内,最后展示支付结果。CSDN前端领域优质创作者,资深前端开发工程师,专注前端开发,在CSDN总结工作中遇到的问题或者问题解决方法以及对新技术的分享,欢迎咨询交流,共同学习。),验证通过打开选择支付方式弹窗页面,选择微信支付或者支付宝支付;4.可取消支付,放弃支付会返回会员页面,页面提示支付取消;2.判断支付方式,如果是1,则是微信支付方式。1.判断是否在微信内支付,需要在微信外支付。
Mac命令行修改ipa并重新签名打包
首先在 iOS 设备中打开开发者模式。位于:设置 - 隐私&安全 - 开发者模式(需重启)
一 现象导入MBProgressHUD显示信息时,出现如下异常现象Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_MBProgressHUD", referenced from: objc-class-ref in ViewController.old: symbol(s) not found for architecture x86_64clang: error: linker command failed wit
Profiles >> 加号添加 >> Distribution >> "App Store" >> 选择 2.1 创建的App ID >> 选择绑定 2.3 的发布证书(.cer)>> 输入描述文件名称 >> Generate 生成描述文件 >> Download。Certificates >> 加号添加 >> "App Store and Ad Hoc" >> “Choose File...” >> 选择上一步生成的证书请求文件 >> Continue >> Download。
今天有需求,要实现的功能大致如下:在安卓和ios端实现分享功能可以分享链接,图片,文字,视频,文件,等欢迎大佬多多来给萌新指正,欢迎大家来共同探讨。如果各位看官觉得文章有点点帮助,跪求各位给点个“一键三连”,谢啦~声明:本博文章若非特殊注明皆为原创原文链接。