从零开始学C++之IO流类库(一):流类库继承体系(IO流,文件流,串流)和 字符串流的基本操作

本文主要是介绍从零开始学C++之IO流类库(一):流类库继承体系(IO流,文件流,串流)和 字符串流的基本操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、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++编程规范


这篇关于从零开始学C++之IO流类库(一):流类库继承体系(IO流,文件流,串流)和 字符串流的基本操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/501675

相关文章

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

c/c++的opencv实现图片膨胀

《c/c++的opencv实现图片膨胀》图像膨胀是形态学操作,通过结构元素扩张亮区填充孔洞、连接断开部分、加粗物体,OpenCV的cv::dilate函数实现该操作,本文就来介绍一下opencv图片... 目录什么是图像膨胀?结构元素 (KerChina编程nel)OpenCV 中的 cv::dilate() 函

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

golang float和科学计数法转字符串的实现方式

《golangfloat和科学计数法转字符串的实现方式》:本文主要介绍golangfloat和科学计数法转字符串的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望... 目录golang float和科学计数法转字符串需要对float转字符串做处理总结golang float

Python如何判断字符串中是否包含特殊字符并替换

《Python如何判断字符串中是否包含特殊字符并替换》这篇文章主要为大家详细介绍了如何使用Python实现判断字符串中是否包含特殊字符并使用空字符串替换掉,文中的示例代码讲解详细,感兴趣的小伙伴可以了... 目录python判断字符串中是否包含特殊字符方法一:使用正则表达式方法二:手动检查特定字符Pytho

C++ HTTP框架推荐(特点及优势)

《C++HTTP框架推荐(特点及优势)》:本文主要介绍C++HTTP框架推荐的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Crow2. Drogon3. Pistache4. cpp-httplib5. Beast (Boos

C#继承之里氏替换原则分析

《C#继承之里氏替换原则分析》:本文主要介绍C#继承之里氏替换原则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#里氏替换原则一.概念二.语法表现三.类型检查与转换总结C#里氏替换原则一.概念里氏替换原则是面向对象设计的基本原则之一:核心思想:所有引py