IO相关3(string流)

sstream 头文件定义了三个类型来支持内存 IO,这些类型可以向 string 写入数据,从 string 读取数据,就像 string 是一个 IO 流一样。

istringstream 从 string 读取数据,ostringstream 向 string 写入数据,stringstream 既可以从 string 读取数据也可以向 string 写入数据。类似于 fstream,sstream 中定义的类型也都是继承自 iostream 中的类型。除了继承来的操作,sstream 中定义的类型还增加了一些成员来管理与流相关的 string。可以对 stringstream 对象调用这些操作,但不能对其他 IO 类型调用这些操作:

1     sstream strm;//strm是一个未绑定的stringstream对象.sstream是头文件sstream中定义的一个类型
2     sstream strm1(s);//strm是一个sstream对像,保存string s的一个拷贝.此构造函数是explicit的
3     strm.str();//返回strm所保存的string拷贝
4     strm.str(s);//将string s拷贝到strm中.返沪void

使用 istringstream:

假定有一个文件,列出了一些人和它们的电话号码。某些人只有一个号码,而另一些人则有多个——家庭电话,工作电话,移动电话等。我们输入的文件可能是:

morgan 2017347 72849289

jfsl 7823434

jfkds 7384534 58349578 59308509

每条记录都以一个人名开始,后面跟着一个或多个电话号码。我们首先定义一个简单的类来描述输入数据:

1 //成员默认为共有
2 struct person_info{
3     string name;//存储人名
4     std::vector<string> phones;//存储电话号码
5 };
 1 #include <iostream>
 2 #include <sstream>
 3 #include <vector>
 4 using namespace std;
 5
 6 //成员默认为共有
 7 struct person_info{
 8     string name;//存储人名
 9     std::vector<string> phones;//存储电话号码
10     void print(void) const{
11         cout << name;
12         for(const auto p : phones){
13             cout << " " << p;
14         }
15         cout << endl;
16     }
17 };
18
19 int main(void){
20     string line, word;//分别保存来自输入的一行和单词
21     std::vector<person_info> people;//保存来自输入的所有记录
22
23     while(getline(cin, line)){
24         person_info info;//创建一个保存此记录的数据对象
25         istringstream record(line);//将记录绑定到刚读入的行
26         record >> info.name;
27         while(record >> word){
28             info.phones.push_back(word);
29         }
30         people.push_back(info);//将此记录追加到people末尾
31         // info.print();
32     }
33
34     for(const auto info : people){
35         info.print();
36     }
37     return 0;
38 }

使用 ostringstream:

当我们逐步构造输出,希望最后一起打印时,ostringstream 是很有用的。如:在上一个例子中,我们可能像逐个验证电话号码并改变其格式。如果所有号码都是有效的,我们希望输出一个新的文件,包含改变格式后的号码。对于那些无效号码,我们不会将它们输出到新文件中,而是打印一条包含人名和无效号码的错误信息。

由于我们不希望输出有无效号码的人,因此对于每个人,知道验证完所有电话号码后才可以进行输出操作。但是我们可以先将输出内容 "写入" 到一个内存 ostringstream 中:

 1 #include <iostream>
 2 #include <sstream>
 3 #include <vector>
 4 using namespace std;
 5
 6 //成员默认为共有
 7 struct person_info{
 8     string name;//存储人名
 9     std::vector<string> phones;//存储电话号码
10     void print(void) const{
11         cout << name;
12         for(const auto p : phones){
13             cout << " " << p;
14         }
15         cout << endl;
16     }
17 };
18
19 bool valid(const string &s){
20
21 }
22
23 bool format(const string &s){
24
25 }
26
27 int main(void){
28     string line, word;//分别保存来自输入的一行和单词
29     std::vector<person_info> people;//保存来自输入的所有记录
30
31     while(getline(cin, line)){
32         person_info info;//创建一个保存此记录的数据对象
33         istringstream record(line);//将记录绑定到刚读入的行
34         record >> info.name;
35         while(record >> word){
36             info.phones.push_back(word);
37         }
38         people.push_back(info);//将此记录追加到people末尾
39         // info.print();
40     }
41
42     for(const auto &entry : people){
43         ostringstream formatted, bad_nums;
44         for(const auto &nums : entry.phones){
45             if(!valid(nums)) bad_nums << " " << nums;
46             else formatted << " " << format(nums);
47         }
48         if(bad_nums.str().empty()) cout << entry.name << " " << formatted.str() << endl;
49         else cout << "input error: " << entry.name << " invalid number(s) " << bad_nums.str() << endl;
50     }
51     return 0;
52 }

sstream 通常用于格式转换:

http://blog.csdn.net/xiaogugood/article/details/21447431

原文地址:https://www.cnblogs.com/geloutingyu/p/8270823.html

时间: 2024-10-29 10:01:15

IO相关3(string流)的相关文章

C++读写TXT文件中的string或者int型数据以及string流的用法

对文件的读写操作是我们在做项目时经常用到的,在网上看了很多博客,结合自身的项目经验总结了一下,因此写了这篇博客,有些地方可能直接从别的博客中复制过来,但是都会注明出处. 一.文件的输入输出 fstream提供了三个类,用来实现c++对文件的操作.(文件的创建.读.写). ifstream -- 从已有的文件读入 ofstream -- 向文件写内容 fstream - 打开文件供读写 文件打开模式: ios::in             只读 ios::out            只写 io

java之IO其它类型的流

一.操作基本数据类型的流 DataInputStream DataOutputStream 数据输出流允许应用程序以适当方式将基本java数据类型写入输出流中.然后,应用程序可以使用数据输入流将数据读入. package a; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import

JavaLearning:JAVA IO 之内存操作流

package org.fun.io; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; public class ByteArrayDemo { public static void main(String[] args) { String str = "helloworld";// 定义字符串,全部由小写字母组成 ByteArrayOutputStream bos = null;//

io系列之字符流

java中io流系统庞大,知识点众多,作为小白通过五天的视频书籍学习后,总结了io系列的随笔,以便将来复习查看. 本篇为此系列随笔的第一篇:io系列之字符流. IO流 :对数据的传输流向进行操作,java中将这种操作行为本身封装为对象,以供使用. Input and Output java将io流对象都在IO包中.(java.IO.*) 分类: 按照数据种类分: 字节流 和 字符流, 按照数据流向分: 输出流 和 输入流. 字节流抽象类: InputStream OutputStream 字符流

IO相关操作

IO相关操作 对于IO操作而言,有四个基本的操作:open .read .write .close 我们来逐个解释.    在此之前我们先解释一下什么是文件描述符 文件描述符 操作系统通过一个整数开代表打开的文件,我们将这个整数称为文件描述符. 文件描述符的范围 [ 0 ~ 1024 ] 不同的系统可能上限不同 具体查看方法? `  ulimit -n 0:标准输入 stdin 1:标准输出 stdout 2:标准错误 stderr 系统选择文件描述符的方法,从小到大找第一个未被使用 的文件描述

关于golang中IO相关的Buffer类浅析

io重要的接口 在介绍buffer之前,先来认识两个重要的接口,如下边所示: type Reader interface { Read(p []byte) (n int, err error) } type Writer interface { Write(p []byte) (n int, err error) } 上边两个接口在golang sdk安装目录src/io/io.go中定义.后边凡是涉及到io相关操作的,基本上都实现了这两个接口,如: 1. package bufio 中的Rea

使用System.IO.Combine(string path1, string path2, string path3)四个参数的重载函数提示`System.IO.Path.Combine(string, string, string, string)&#39; is inaccessible due to its protection level

今天用Unity5.5.1开发提取Assets目录的模块,使用时采用System.IO.Path.Combine(string, string, string, string)函数进行路径生成 明明是公有函数,为何会报错,奇了怪了 有谁知道什么原因?欢迎交流 ....... ... 重新打开了一下 ,可以了.版本原因 使用System.IO.Combine(string path1, string path2, string path3)四个参数的重载函数提示`System.IO.Path.Co

JavaScript正则表达式-相关的String对象方法

JavaScript正则表达式相关的String对象方法有三个: 1.match(). 2.replace(). 3.search(). match() match(regExp); 使用指定的正则表达式来搜索字符串. 如果找到匹配字符串返回一个数组,否则返回null. 返回的数组包含两个属性:index和input. index是匹配字符串在原字符串中的位置. input属性是对原字符串的引用. var reg_pattern = /a\d/; var str = "apple,a2,b3,a

Delphi FMX 手机目录提取,把IO相关的都提取到System.IoUtils单元中

Delphi把IO相关的都提取到System.IoUtils单元中.路径操作使用TPath的方法都很方便.uses System.IoUtils TPath.GetTempPath//临时目录TPath.GetCameraPath//照相机目录(照片/录像)TPath.GetMusicPath//音乐目录TPath.GetDownloadsPath//下载目录……如果使用TPath类的静态方法那么代码就是跨平台的,在Windows,Mac,iOS,Android上都能用.如果仅仅对Android