从零开始学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]

#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:将一个字符添加到流

#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的功能

(一)、分割单词

#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 类型互相转换

#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 的功能

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Ryan Miao

java基础面试题

参考:http://blog.csdn.net/jackfrued/article/details/44921941 说未经允许不转载,我只好参考了。 1.面向...

3105
来自专栏小勇DW3

Java设计模式-单例模式

作为对象的创建模式,单例模式确保其某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类。单例模式有以下特点:

925
来自专栏技术墨客

JVM与字节码——类的方法区模型 原

这是一段平凡得不能再平凡的Java代码,稍微有点编程语言入门知识的人都能理解它表达的意思:

512
来自专栏喔家ArchiSelf

全栈必备 Java基础

那一年,从北邮毕业,同一年,在大洋的彼岸诞生了一门对软件业将产生重大影响的编程语言,它就是——Java。1998年的时候,开始学习Java1.2,并在Java ...

684
来自专栏Golang语言社区

深入解析 Go 中 Slice 底层实现

切片是 Go 中的一种基本的数据结构,使用这种结构可以用来管理数据集合。切片的设计想法是由动态数组概念而来,为了开发者可以更加方便的使一个数据结构可以自动增加和...

902
来自专栏IT技术精选文摘

易犯的Java内存泄漏代码

Java隐式地通过GC(守护线程)回收内存。 GC定期检查是否存在无法访问的对象,或者确切地说,没有指向该对象的引用。如果是这样,GC回收新可用的内存。 现在...

1817
来自专栏机器学习从入门到成神

海量数据处理之Bti-map详解

    所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以...

581
来自专栏Java 源码分析

Java 虚拟机运行时数据区

运行时数据区: Java 虚拟机的运行时数据区按照大的可以分为线程独立使用的数据区,和所有线程共享的数据区。 一.线程独立使用数据区 1.程序计数器 程序计数器...

2445
来自专栏yang0range

Java的面试基础题(二)

1)特点:存储对象;长度可变;存储对象的类型可不同 2)Collection (1)List:有序的;元素可重复,有索引 (add(index, elem...

782
来自专栏Java 源码分析

数据结构Queue

​ 栈和队列其实是相同的,只是名字不一样 入栈换成了入队(enqueue),出栈换成了出队(dequeue)。语义 是不同的。入队操作向队尾添加元素,而出...

2485

扫码关注云+社区