string对象的读写

用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对象中)
 

### std::stringstream 的读写实现过程 #### 头文件引入 为了使用 `std::stringstream`,需要包含 `<sstream>` 头文件[^2]。 ```cpp #include <sstream> ``` #### 默认构造函数 创建一个默认的 `std::stringstream` 对象时,默认情况下该对象可以用于输入输出操作。以下是默认构造的一个子: ```cpp std::stringstream buf1; buf1 << 1; // 向流中写入整数 1 int n = 0; buf1 >> n; // 从流中读取数据到变量 n std::cout << "buf1 = " << buf1.str() << " n = " << n << '\n'; ``` 上述代码展示了如何向 `std::stringstream` 写入数据以及从中读取数据[^3]。 #### 输入模式下的字符串流 当需要仅作为输入流使用时,可以选择 `std::istringstream` 类型的对象。以下是一个简单的示: ```cpp std::istringstream inbuf("-1"); inbuf >> n; // 将 "-1" 转换为整数值并存储到变量 n 中 std::cout << "n = " << n << '\n'; ``` 此部分说明了如何利用 `std::istringstream` 进行只读操作。 #### 输出模式下的字符串流 对于输出操作,则可选用 `std::ostringstream` 或者设置特定标志位来控制行为。如,在追加模式下初始化 `std::ostringstream` 并执行写入动作如下所示: ```cpp std::ostringstream buf2("test", std::ios_base::ate); buf2 << '1'; // 在现有内容后面附加字符 '1' std::cout << buf2.str() << '\n'; ``` 这里体现了通过指定参数以改变初始状态从而影响后续逻辑的能力。 #### 关于模板特化 值得注意的是,`std::stringstream` 是基于更通用形式定义出来的具体版本之一——即它是 `std::basic_stringstream<char>` 的实化结果[^4]。 综上所述,这些功能共同构成了 C++ 中灵活处理文本信息的基础工具集的一部分。 ```cpp // 综合示程序展示完整的读写流程 #include <iostream> #include <sstream> int main(){ // 初始化双向流 std::stringstream ss; // 执行写入操作 ss << "The answer is "; double d = 42.0/9.0; ss << d; // 获取当前缓冲区中的全部内容 std::string result = ss.str(); // 清空内部指针位置以便重新解析已有的数据 ss.clear(); ss.seekg(0); char buffer[256]; ss.getline(buffer, sizeof(buffer)-1,' '); // 提取第一个单词"The" std::cout<<buffer<<"\n"; return 0; } ``` 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值