string对象的读写

来源:互联网 发布:手机淘宝能买彩票么 编辑:程序博客网 时间:2024/05/21 22:38

用iostream标准库来读写内置类型的值我们已经学过,比如int,double等.同样,我们也可以用ostream和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的string,第二行代码cin>>s是从标准输入读取string,并将读入的串存储在s中.

string类型的输入操作符:

读取并忽略开头所有的空白字符(如空格,换行符,制表符)

读取字符直至再次遇到空白字符,读取终止.

因此,如果输入到程序的是"   Hello World!   "(注意,前后都有空格),则屏幕上将输出"Hello",而不含任何空格,World也不会显示,再次遇到空白字符的时候已经终止了.

输入和输出操作的行为与内置类型操作符基本类似.尤其是,这些操作符返回左操作数作为运算结果.因此,我们可以把多个读操作或多个写操作放在一起:

string s1,s2;
cin>>s1>>s2;  //read first input into s1,second into s2
cout<<s1<<s2<<endl;   //write both strings

如果给定和上一个程序同样的输入("  Hello World  "),则输出的结果将是: HelloWorld!

小心:对于上例,编译时必须加上#include来表示iostream和string标准库,以及给出用到的所有标准库中的名字.如(string,cin,cout,endl)的using声明.从这里开始,所有程序均假设程序中所有必需的#include和using声明已给出.

1.读入未知数目的string对象

和内置类型的输入操作符一样,string的输入操作符也会返回所读的数据流.因此,可以把输入操作作为判断条件.下面的程序将从标准输入读取一组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 and-of-file
 while(getline(cin,line))
  cout<<line<<endl;
 return 0;
}

由于line不含换行符,若要逐行输出需要自行添加.照常,我们用endl来输出一个换行符并刷新输出缓冲区.

注解:由于getline函数返回时丢弃换行符,换行符将不会存储在string对象中.

习题:编写程序实现从标准输入每次读入一行文本.然后改写程序,每次读入一个单词.

//从标准输入每次读入一行文本
#include<iostream.h>
#include<string.h>
using namespace std::
int main()
{
 string line;
 //一次读入一行,直至遇见文件结束符.
 while(getline(cin,line))
  cout<<line<<endl;//输出相应行以进行验证
 return 0;
}

修改后程序如下:
//从标准输入每次读入一个单词
#include<iostream.h>
#include<string.h>
using namespace std::
int main()
{
 string word;
 //一次读入一个单词,直至遇见文件结束符
 while(cin>>word)
  cout<<word<<endl; //输出相应单词以进行验证
 return 0;
}

解释string类型的输入操作符和getline函数分别如何处理空白字符

string类型的输入操作符对空白字符的处理,读取并忽略有效字符(非空白字符)之前的空白字符,然后读取字符直至再次遇到空白字符,读取终止(该空白字符仍留在输入流中)

getline函数对空白字符的处理,不忽略行开头的空白字符,读取字符直至遇到换行符,读取终止并丢弃换行符(换行符从输入流中去掉但并不存储在string对象中)
 

原创粉丝点击