文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C/C++中字符串流详解及其作用介绍

2024-04-02 19:55

关注

概述

文件流类和字符串流类都是 ostream, istream 和 iostream 类的派生类, 因此对它们的操作方法是基本相同的.

在这里插入图片描述

字符串流

文件流 字符串流
概念 文件流是以外存文件为输入输出对象的数据流 字符串流也 称为内存流, 以内存中用户定义的字符数组 (字符串) 为输入输出的对象
相关流类 ifstream, ofstream 和 fstream strstream
头文件 ifstream, ofstream 和 fstream strstream

文件流类和字符串流类都是 ostream, istream 和 iostream 类的派生类, 因此对它们的操作方法是基本相同的.

理解字符串流

我们是输入是字符串形式, 存放在缓冲区内. 在数据内部是以二进制的方式表示的. 所以输出也是字符串形式的, 存储在输出缓冲区中.


#include <iostream>
using namespace std;

int main() {
    double m, n;
    char op;

    cin >> m >> op >> n;
    cout << m << " " << n << " " << op;

    return 0;
}

输出结果:

123.45 + 6789.10
123.45 6789.1 +

输出字符串对象

字符串流类没有open成员函数, 通过调用构造函数建立字符串流对象.

ostream 类的构造函数的原型:


ostrstream::ostrstream(char *buffer, int n, int mode=ios::out);

建立输出字符串流对象并与字符数组建立关联:


char ch1[20];
ostrstream strout(ch1, 20);

在这里插入图片描述

输入字符串流对象

istrstream 类的两个带参的构造函数, 原型为:


istrstream::istrstream(char *buffer);
istrstream::istrstream(char *buffer, int n);

建立输入字符串流对象:


char ch2[40];
istrstream strin(ch2);  // 将字符数组ch2中的全部数据作为输入字符串流的内容
istrstream strin(ch2,20);  // 只将字符数组ch2中的前20个字符作为输入字符串流的内容

输入输出字符串流对象

strstream 类提供的构造函数的原型为:


strstream::strstream(char *buffer, int n, int mode);

举个栗子:


char ch3[80];
strstream strio(ch3, sizeof(ch3), ios::in|ios::out);

案例一

写字符数组:


#include <iostream>
#include <strstream>
#include "Student.h"
using namespace std;

int main( )
{
    // 定义数组
    Student stud[3]= {
            {1001, "Little"},
            {1002, "Mid"},
            {1003, "Big"},
    };

    char c[50];  // 定义char数组存放字符流
    ostrstream strout1(c, 30);
    for(int i = 0; i < 3; i++)
        strout1 << stud[i].id << stud[i].name;
    strout1 << ends; // ends是C++的I/O操作符,插入一个′\0′
    cout << "array c:" << c << endl;

    ostrstream strout2(c, 40);
    for(int i = 0; i < 3; i++)
        strout2 << stud[i].id << " " << stud[i].name << " ";
    strout2 << ends;
    cout << "array c:" << c << endl;

    return 0;
}

输出结果:

array c:1001Little1002Mid1003Big
array c:1001 Little 1002 Mid 1003 Big

案例二

以字符串流为中介交换数据:


#include <iostream>
#include <strstream>
using namespace std;

int* bubble_sort(int array[10]);
void display(int array[10]);


int main() {
    // 定义数组
    char c[50] = "23 45 56 -23 -32 33 61 99 88 77";
    int a[10], *pt;

    // 输入字符串流
    cout << "array c: " << c << endl;
    istrstream strin(c, sizeof(c));
    for (int i = 0; i < 10; i++) {
        strin >> a[i];
    }

    // 调试输出
    cout << "array a: ";
    display(a);
    cout << endl;

    // 对数组 a 排序进行冒泡排序
    pt = bubble_sort(a);

    // 输出字符串流
    ostrstream strout(c, sizeof(c));
    for (int i = 0; i < 10; ++i) {
        strout << *(pt+i) << " ";
    }

    cout << "array c: " << c << endl;

    return 0;
}

输出结果:

array c: 23 45 56 -23 -32 33 61 99 88 77
array a: 23 45 56 -23 -32 33 61 99 88 77
array c: -32 -23 23 33 45 56 61 77 88 99

在这里插入图片描述

字符数组 vs 文件

输出时数据不是流向外存文件, 而是流向内存中的一个存储空间. 输入时从内存中的存储空间读取数据.

在这里插入图片描述

字符串流对象关联的不是文件, 而是内存中的一个字符数组. 因此不需要打开和关闭文件.

每个文件的最后都有一个文件结束符, 表示文件的结束. 而字符流所关联的字符数组中没有相应的结束标志. 用户要指定一个特殊字符 ends('\0') 作为结束符, 在向字符数组写入全部数据后要写入此字符.

总结

到此这篇关于C/C++中字符串流详解及其作用介绍的文章就介绍到这了,更多相关C++字符串流内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯