3.2.2 String的读写
我们已在第1章学习了用iostream标准库来读写内置类型的值,如int,double等。同样地,也可以用iostream和string标准库,使用标准输入输出操作符来读写string对象:
// Note: #include and using declarations must be added to compile this code int main() { string s; // empty string cin >> s; // read whitespace-separated string into s cout << s << endl; // write s to the output return 0; } |
以上程序首先定义命名为s的字符串,第二行代码:
cin >> s; // read whitespace-separated string into s |
从标准输入读取string,并将读入的串存储在s中。string类型的输入操作符:
读取并忽略开头所有的空白字符(如空格,换行符,制表符)。
读取字符直至再次遇到空白字符,读取终止。
因此,如果输入到程序的是“ Hello World! ”(注意到开头和结尾的空格),则屏幕上将输出“Hello”,而不含任何空格。
输入和输出操作的行为与内置类型操作符基本类似。尤其是,这些操作符返回左操作数作为运算结果。因此,我们可以把多个读操作或多个写操作放在一起:
string s1, s2; cin >> s1 >> s2; // read first input into s1, second into s2 cout << s1 << s2 << endl; // write both strings
|
如果给定和上一个程序同样的输入,则输出的结果将是:
HelloWorld!
对于上例,编译时必须加上#include来标示iostream和string标准库,以及给出用到的所有标准库中的名字(如string,cin,cout,endl)的using声明。
从本例开始的程序均假设程序中所有必须的#include和using声明已给出。
1. 读入未知数目的string对象
和内置类型的输入操作符一样,string的输入操作符也会返回所读的数据流。因此,可以把输入操作作为判断条件,这与我们在1.4.4节读取整型数据的程序做法是一样的。下面的程序将从标准输入读取一组string对象,然后在标准输出上逐行输出:
int main() { string word; // read until end-of-file, writing each word to a new line while (cin >> word) cout << word << endl; return 0; } |
上例中,用输入操作符来读取string对象。该操作符返回所读的istream对象,并在读取结束后,作为while的判断条件。如果输入流是有效的,即还没到达文件尾且没遇到无效输入,则执行while循环体,并将读取到的字符串输出到标准输出。如果到达了文件尾,则跳出while循环。
2. 用getline读取整行文本
另外还有一个有用的string IO操作:getline。这个函数接受两个参数:一个输入流对象和一个string对象。getline函数从输入流的下一行读取,并保存读取的内容到string中,但不包括换行符。和输入操作符不一样的是,getline并不忽略行开头的换行符。只要getline遇到换行符,即便它是输入的第一个字符,getline也将停止读入并返回。如果第一个字符就是换行符,则string参数将被置为空string。
getline函数将istream参数作为返回值,和输入操作符一样也把它用作判断条件。例如,重写前面那段程序,把每行输出一个单词改为每次输出一行文本:
int main() { string line; // read line at time until end-of-file while (getline(cin, line)) cout << line << endl; return 0; } |
由于line不含换行符,若要逐行输出需要自行添加。照常,我们用endl来输出一个换行符并刷新输出缓冲区。
注意由于getline函数返回时丢弃换行符,换行符将不会存储在string对象中。
习题
习题3.5 编写程序实现从标准输入每次读入一行文本。然后改写程序,每次读入一个单词。
习题3.6 解释string类型的输入操作符和getline函数分别如何处理空白字符。
【责任编辑:
董书 TEL:(010)68476606】