一、IO、流

数据的输入和输出(input/output简写为I/O)
对标准输入设备和标准输出设备的输入输出简称为标准I/O
对在外存磁盘上文件的输入输出简称为文件I/O
对内存中指定的字符串存储空间的输入输出简称为串I/O

数据输入输出的过程,可以形象地看成流
从流中获取数据的操作称为“提取”(输入)操作
向流中添加数据的操作称为“插入”(输出)操作
标准输入输出流
文件流
字符串流

二、流类库继承体系、四个输入输出对象

流库具有两个平行的基类:streambuf 和 ios 类,所有流类均以两者之一作为基类

streambuf 类提供对缓冲区的低级操作:设置缓冲区、对缓冲区指针操作区存/取字符
ios_base、ios 类记录流状态,支持对streambuf 的缓冲区输入/输出的格式化或非格式化转换
stringbuf:使用串保存字符序列。扩展 streambuf 在缓冲区提取和插入的管理
filebuf:使用文件保存字符序列。包括打开文件;读/写、查找字符

如下图:

C++为用户进行标准I/O操作定义了四个类对象: cin,cout,cerr和clog

cin为istream流类的对象,代表标准输入设备键盘,后三个为ostream流类的对象

cout代表标准输出设备显示器

cerr和clog含义相同,均代表错误信息输出设备显示器

三、ostream流 的操作,istream 流的操作

(一)、ostream流 的操作:

1、operator <<

<<操作返回一个ostream对象的引用,所以可以连续使用

2、put( )

输出单个字符

返回一个ostream对象的引用

cout.put(‘H’).put(‘i’);

3、write( )

write(buf, len)

write( )返回一个ostream对象的引用

cout.write (buf, len)  //char buf[len]

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
#include <iostream>

using namespace std;

int main(void)
{
    int n = 100;
    int n2 = 200;
    cout << n << " " << n2 << endl;

cout.put('H');
    cout.put('i');
    cout.put(' ');
    cout.put('H').put('i').put('\n');

char buf[] = "test!!!!!";
    cout.write(buf, 5);

return 0;
}

(二)、istream流 的操作:

1、opeartor>>操作

<<操作返回一个ostream对象的引用,所以可以连续使用

2、get( )

get( )操作:

读取单个字符

返回一个整数

字符的ASCII码

get(char&)操作:

读取单个字符

返回一个istream对象的引用

3、getline( )

读取一行

遇到回车键

返回istream对象的引用
getline()操作与>>的区别:

char string1 [256],

cin.getline(string1, 256);     //get a whole line, 以'\0'结尾

cin >> string1;    //stop at the 1st blank space

4、read( )

read(buf, len)
返回一个istream对象的引用
对空白字符(包括'\n')照读不误

5、peek( ) 与 putpack()

peek:查看而不读取
putback:将一个字符添加到

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 
#include <iostream>

using namespace std;

int main(void)
{

//int n;
    //char ch;

//cin>>n>>ch;
    //cout<<"n="<<n<<" "<<"ch="<<ch<<endl;

//int ch = cin.get();
    //cout<<ch<<endl;

//char ch1;
    //char ch2;
    //cin.get(ch1).get(ch2);
    //cout<<ch1<<" "<<ch2<<endl;

char buf[10] = {0};
    cin.getline(buf, 10);
    cout << buf << endl;

//char buf[10] = {0};
    //cin>>buf;
    //cout<<buf<<endl;

//char buf[10] = {0};
    //cin.read(buf, 5);
    //cout<<buf<<endl;

/*char c[10], c2, c3;

c2 = cin.get( );
    c3 = cin.get( );
    cin.putback( c2 );
    cin.getline( &c[0], 10);
    cout << c << endl;*/

return 0;
}

二、字符串流的基本操作

istringstream,由istream派生而来,提供读string的功能
ostringstream,由ostream派生而来,提供写string的功能
stringstream,由iostream派生而来,提供读写string的功能

(一)、分割单词

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
#include <iostream>
#include <sstream>

using namespace std;

int main(void)
{
    string line;
    string word;

while (getline(cin, line))
    {
        istringstream iss(line);

while (iss >> word)
            cout << word << "#";
        cout << endl;
    }
    return 0;
}

(二)、字符串与double 类型互相转换

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
#include <iostream>
#include <sstream>

using namespace std;

string doubletostr(double val)
{
    ostringstream oss;
    oss << val;

return oss.str(); // return string copy of character array
}

double strtodouble(const string &str)
{
    istringstream iss(str);
    double val;
    iss >> val;
    return val;
}

int main(void)
{
    double val = 55.55;

string str = doubletostr(val);
    cout << str << endl;

str = "123.123";
    val = strtodouble(str);
    cout << val << endl;
    return 0;

}

(三)、实现类似sscanf, sprinft 的功能

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 
#include <iostream>
#include <sstream>

using namespace std;

int main(void)
{

//192,168,0,100;
    //sscanf,sprintf;

//istringstream iss("192,168,0,100");
    //int v1;
    //int v2;
    //int v3;
    //int v4;
    //char ch;
    //iss>>v1>>ch>>v2>>ch>>v3>>ch>>v4;

//ch = '.';
    //ostringstream oss;
    //oss<<v1<<ch<<v2<<ch<<v3<<ch<<v4;

//cout<<oss.str()<<endl;

string buf("192,168,0,100");
    stringstream ss(buf);
    int v1;
    int v2;
    int v3;
    int v4;
    char ch;
    ss >> v1 >> ch >> v2 >> ch >> v3 >> ch >> v4;

ch = '.';
    stringstream ss2;
    ss2 << v1 << ch << v2 << ch << v3 << ch << v4;

cout << ss2.str() << endl;

return 0;

}

输出为192.168.0.100

参考:

C++ primer 第四版
Effective C++ 3rd
C++编程规范

流类库继承体系(IO流,文件流,串流)和 字符串流的基本操作的更多相关文章

  1. java IO流的继承体系和装饰类应用

    java IO流的设计是基于装饰者模式&适配模式,面对IO流庞大的包装类体系,核心是要抓住其功能所对应的装饰类. 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的 ...

  2. 从零开始学C++之IO流类库(三):文件的读写、二进制文件的读写、文件随机读写

    一.文件的读写 如前面所提,流的读写主要有<<, >>, get, put, read, write 等操作,ofstream 继承自ostream, ifstream 继承自 ...

  3. 从零开始学C++之IO流类库(二):文件流(fstream, ifstream, ofstream)的打开关闭、流状态

    一.文件流 ofstream,由ostream派生而来,用于写文件 ifstream,由istream派生而来, 用于读文件 fstream,由iostream派生而来,用于读写文件 二.打开文件 说 ...

  4. C++学习50 对字符串流的读写

    文件流是以外存文件为输入输出对象的数据流,字符串流不是以外存文件为输入输出的对象,而以内存中用户定义的字符数组(字符串)为输入输出的对象,即将数据输出到内存中的字符数组,或者从字符数组(字符串)将数据 ...

  5. C# 基础知识系列- 14 IO篇 文件的操作

    0. 前言 本章节是IO篇的第二集,我们在上一篇中介绍了C#中IO的基本概念和一些基本方法,接下来我们介绍一下操作文件的方法.在编程的世界中,操作文件是一个很重要的技能. 1. 文件.目录和路径 在开 ...

  6. JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码

    JAVA之旅(三十)--打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码 三十篇了,又是一个 ...

  7. 第十四周总结 Io之文件流

    I/O相关 输入/输出 流(数据流动) 数据流动的方向 读数据(输入input) 写数据(输出output) 文件流 字符流 数据流 对象流 网络流.... 1.什么叫文件 一种电脑的存储方式 文件有 ...

  8. java IO之字节流和字符流-Reader和Writer以及实现文件复制拷贝

    接上一篇的字节流,以下主要介绍字符流.字符流和字节流的差别以及文件复制拷贝.在程序中一个字符等于两个字节.而一个汉字占俩个字节(一般有限面试会问:一个char是否能存下一个汉字,答案当然是能了,一个c ...

  9. Java文件(io)编程——文件字符流的使用

    案例1: 读取一个文件并写入到另一个文件中,char[] 来中转. 首先要在E盘下创建一个文本文档,命名为test.txt,输入一些字符串. public class Demo_5 { public ...

随机推荐

  1. Linux下ip route、ip rule、iptables的关系(转)

    1.基础知识 1.1 路由 (Routing) 1.1.1 路由策略 (使用 ip rule 命令操作路由策略数据库) 基于策略的路由比传统路由在功能上更强大,使用更灵活,它使网络管理员不仅能够根据目 ...

  2. OpenCV2马拉松第12圈——直方图比較

    收入囊中 使用4种不同的方法进行直方图比較 葵花宝典 要比較两个直方图, 首先必需要选择一个衡量直方图相似度的对照标准.也就是先说明要在哪个方面做对照. 我们能够想出非常多办法,OpenCV採用了下面 ...

  3. Android中MVC模型(复合模式)

    mvc是model,view,controller的缩写,mvc包括三个部分: 1.模型(model)对象:是应用程序的主体部分,全部的业务逻辑都应该写在该层. 2.视图(view)对象:是应用程序中 ...

  4. 阻止picker.js插件弹出键盘

    <input id="focus" type="text" value="" placeholder="手机号" ...

  5. (转)rtmp协议简单解析以及用其发送h264的flv文件

    Adobe公司太坑人了,官方文档公布的信息根本就不全,如果只按照他上面的写的话,是没法用的.按照文档上面的流程,server和client连接之后首先要进行握手,握手成功之后进行一些交互,其实就是交互 ...

  6. jdbc如何锁定某一条数据或者表,不让别人操作?

    jdbc如何锁定某一条数据或者表,不让别人操作? 只有并发的时候才会有死锁,你要把多个涉及到这个表的地方检查一下,排除死锁可能. 为了避免修改冲突,所以我要锁定.请问该如何实现 答: 例如:selec ...

  7. 数学图形(1.19)Doppler spiral螺线

    一种左右对称的螺线 相关软件参见:数学图形可视化工具,使用自己定义语法的脚本代码生成数学图形.该软件免费开源.QQ交流群: 367752815 vertices = t = *PI) to (*PI) ...

  8. JS性能优化之创建文档碎片(document.createDocumentFragment)

    讲这个方法之前,我们应该先了解下插入节点时浏览器会做什么.         在浏览器中,我们一旦把节点添加到document.body(或者其他节点)中,页面就会更新并反映出这个变化,对于少量的更新, ...

  9. JSP学习笔记(一):JSP语法和指令

    一.语法 1.脚本程序的语法格式: 脚本程序可以包含任意量的Java语句.变量.方法或表达式,只要它们在脚本语言中是有效的. <% 代码片段 %> 2.中文编码问题 如果我们要在页面正常显 ...

  10. JAVA:连接池技术说明以及MVC设计模式理解

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjgzMDgwNw==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...