1、istream 类成员
2、cin
cin 输入接触到第一个非空格字符时开始阅读,当遇到下一个空格字符(空格、制表符、换行符)时就会停止读取。因此可以放在while中作为输入bool类型的输入结束判断符
while(cin>>x)
为了避免cin对于空白符的忽略问题,可以用getline函数
3、getline函数
getline函数可以读取整行,包括前导和嵌入式的空格,并将其存储在字符串对象中。
C++有两种getline函数:
第一种:在头文件#include<istream>中,是iostream类的成员函数,有两种重载形式:
istream& getline(char* s, streamsize n);
istream& getline(char* s, streamsize n, char delim);
作用是:从istream中读取至多n个字符(包含结束标记符)保存在s对赢得数组中。即使还没读够n个字符。如果遇到delim或者字符达到限制,则读取一行终止,delim都不会被保存进s对应的数组中。
使用标准输入流和标准输出流,std::cin; std::cout; std::endl;
使用规范 std::cin.getline(...);
用法示例:
(1) char buf[20];
char a = 'q';
//cin.getline(buf, 10)
std::cin.getline(buf, 10 ,a)
以输入遇到回车换行符'\n'作为结束, 或着满10个字符结束,或者遇到设定的字符a = 'a'结束字符流读取。
第二种:在头文件#include<string>中,是普通函数,有四种重载形式。
istream& getline(istream& is, string& str, char delim);
istream& getline(istream&& is, string& str, char delim);
istream& getline(istream& is, string& str);
istream& getline(istream&& is, string& str);
用法和第一种类似,但是读取的istream是作为参数 is 传进函数的,读取的字符串保存在string类型的str中。is : 表示一个输入流,例如cin。其中 str : 为string类型的引用,用来存储输入流中的流信息。delim :为char类型的变量,截断字符。不定义的情况下,默认遇到 ‘\n'代表一行的输入结束。
用法示例:
(2)char str;
// 在输入时,直至遇到‘\n’或EOF, 才终止一行字符串输入操作。
getline(cin, str);
//以输入遇到回车换行符'\n'或EOF作为一行字符串输入操作结束, 或者遇到设定的字符 'q' 也可作为字符流读取结束。
getline(cin, str, 'q')
首先对于EOF,是C语言中为了区分有效数据和输入结束符的,由系统锁定。windows下是ctrl+z , linux/unix下是ctrl + d)
getline不是C的库函数,而是C++的库函数。遇到一下情况时,字符流结束。
(1)到文件结束 (2) 遇到函数定界符 (3) 输入达到最大长度限制
用getline()函数用在while中作为条件判断!
string str;
while(getline(cin, str)){
cout<<str;
}
会一直输入,遇到换行'\n' 符则(执行一次while循环体),循环继续,再进入输入状态。直到EOF事件发生,如ctrl+z 则跳出while循环,结束。
string str;
while(getline(cin, str, 'q')){
cout<<str;
}
会一直循环输入,遇到'\n' 时也不影响,直到遇到 'q' 字符则(执行一次while循环体)既此处为输出打印一次,然后循环继续,再进入输入状态。直到EOF事件发生,如ctrl+z 则跳出while循环,结束。
总结:关于getline() 函数在while中作为条件判断时,判断当前是否存在有效的输入流对象,判断的是cin流的状态,所以正常输入的情况下跳不出while(getline(cin,str))或while(getline(cin,str, 'q'))的判断条件,而遇到 '\n'或 'q'时判断条件为真,则仅仅代表一行或一次的输入结束,因此进入while循环体执行一次while中的语句块。直到最终通过EOF事件的发生,跳出while循环。