C++ 字符串流
Posted 我是小白呀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 字符串流相关的知识,希望对你有一定的参考价值。
概述
文件流类和字符串流类都是 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);
- buffer 是指向字符数组首元素的指针
- n 为指定的缓冲区的大小 (一般选与字符数组的大小相同)
- mode 指操作方式, 默认为
ios::out
方式
建立输出字符串流对象并与字符数组建立关联:
char ch1[20];
ostrstream strout(ch1, 20);
输入字符串流对象
istrstream 类的两个带参的构造函数, 原型为:
istrstream::istrstream(char *buffer);
istrstream::istrstream(char *buffer, int n);
- buffer 是指向字符数组首元素的指针, 用它来初始化流对象
- n 是缓冲区大小, 可以用字符数组中的一部分
建立输入字符串流对象:
char ch2[40];
istrstream strin(ch2); // 将字符数组ch2中的全部数据作为输入字符串流的内容
istrstream strin(ch2,20); // 只将字符数组ch2中的前20个字符作为输入字符串流的内容
输入输出字符串流对象
strstream 类提供的构造函数的原型为:
strstream::strstream(char *buffer, int n, int mode);
- buffer 是指向字符数组首元素的指针
- n 为指定的缓冲区的大小 (一般选与字符数组的大小相同)
- mode 指操作方式, 默认为
ios::out
方式
举个栗子:
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’) 作为结束符, 在向字符数组写入全部数据后要写入此字符.
总结
- 通过字符串流从字符数组读数据就如同从键盘读数据一样, 可以从字符数组读入字符数据, 也可以读入整数, 浮点数或其他类型数据
- 同一字符数组可以先后与不同字符串流 (strin 或 strout) 建立关联. 分别对用一字符数组进行操作, 甚至可以对字符数组交叉进行读写
- 用输出字符串流向字符数组些数据时, 是从数组的首地址开始的, 因此更新了数组的内容
- 与字符串流关联的字符数组并不一定是专为字符串流而定义的数组, 可以对该数组进行其他一般操作
- 与字符串流关联的字符数组相当于内存中的临时仓库, 可以以 ASCII 形式存放各种类型的数据, 在需要时再从中读回来. 其他用法相当于标准设备 (显示器与键盘), 同时具有诸多好处
以上是关于C++ 字符串流的主要内容,如果未能解决你的问题,请参考以下文章