【C++】POCO学习总结(十二):流(文本编解码、数据压缩、文件读写流等)

【C++】郭老二博文之:C++目录

1、说明

POCO提供了多种流类,与标准c++ IOStreams兼容。
大多数POCO流类被实现为过滤器,这意味着它们不写入或读取设备,而是从它们连接的另一个流。

2、文本编解码

2.1 说明

POCO提供了用于编码和解码Base64和HexBinary格式数据的过滤器流类。
Base64和HexBinary都可以用来编码任意二进制数据,只使用可打印的ASCII字符。
Base64使用数字、大小写字符,以及’+‘和’-'来编码6位组。编码后的数据占用的空间是原始数据的1.33倍。
HexBinary使用数字和字符’A’到’F’来编码4位的组。编码的数据占用两倍的空间。

2.2 编解码

Poco::Base64Encoder
Poco::HexBinaryEncoder
Poco::Base64Decoder
Poco::HexBinaryDecoder

#include "Poco/Base64Encoder.h"
#include <iostream>
using Poco::Base64Encoder;
int main(int argc, char** argv)
{
	Base64Encoder encoder(std::cout);
	encoder << "Hello, world!";
	return 0;
}

编译:

g++ enc.cpp -I ~/git/poco/install/include -L ~/git/poco/install/lib -lPocoFoundationd

输出

SGVsbG8sIHdvcmxkIQ==

2、 zlib压缩

2.1 相关类

压缩:
Poco::DeflatingInputStream
Poco::DeflatingOutputStream

解压:
Poco::InflatingInputStream
Poco::InflatingOutputStream
在这里插入图片描述

2.2 示例

#include "Poco/DeflatingStream.h"
#include <fstream>
using Poco::DeflatingOutputStream;
using Poco::DeflatingStreamBuf;
int main(int argc, char** argv)
{
	std::ofstream ostr("test.gz", std::ios::binary);
	DeflatingOutputStream deflater(ostr, DeflatingStreamBuf::STREAM_GZIP);
	deflater << "Hello, world!";
	// 确保在连接的流关闭之前清空缓冲区
	deflater.close();
	ostr.close();
	return 0;
}

编译:

g++ zlib.cpp -I ~/git/poco/install/include -L ~/git/poco/install/lib -lPocoFoundationd

3、特殊流

3.1 统计

Poco::CountingInputStream 和 Poco::CountingOutputStream
计算文件中的字符和行数。它们还跟踪当前的行号和列位置。

3.2 转换换行符

Poco::InputLineEndingConverter 和 Poco::OutputLineEndingConverter
在Unix (LF)、DOS/Windows (CRLF)和Mac (CR)之间转换换行符。

#include "Poco/LineEndingConverter.h"
#include "Poco/FileStream.h"
#include "Poco/StreamCopier.h"
#include "Poco/String.h"
#include <sstream>
#include <iostream>


using Poco::InputLineEndingConverter;
using Poco::LineEnding;
using Poco::StreamCopier;
using Poco::FileInputStream;
using Poco::FileOutputStream;
using Poco::icompare;


inline void dosToUnix(std::istream& input, std::ostream& output)
{
	InputLineEndingConverter conv(input, LineEnding::NEWLINE_LF);
	StreamCopier::copyStream(conv, output);
}


inline void unixToDos(std::istream& input, std::ostream& output)
{
	InputLineEndingConverter conv(input, LineEnding::NEWLINE_CRLF);
	StreamCopier::copyStream(conv, output);
}


inline int usage()
{
	std::cout << "Usage: LineEndingConverter {u2d | d2u} filename" << std::endl;
	return -1;
}


int main(int argc, char** argv)
{
	if (argc < 3) return usage();
	if (strlen(argv[1]) != 3) return usage();

	std::string conv(argv[1]);

	FileInputStream fis(argv[2]);
	std::stringstream ss;
	StreamCopier::copyStream(fis, ss);
	fis.close();

	FileOutputStream fos(argv[2]);
	if (0 == icompare(conv, "u2d")) unixToDos(ss, fos);
	else if (0 == icompare(conv, "d2u")) dosToUnix(ss, fos);
	else return usage();
	fos.flush();

	return 0;
}

3.3 复制流

Poco::TeeInputStream 和 Poco::TeeOutputStream
将经过它们的所有字符(读或写)复制到一个或多个输出流

#include "Poco/TeeStream.h"
#include <iostream>
#include <fstream>
using Poco::TeeOutputStream;
int main(int argc, char** argv)
{
	TeeOutputStream tee(std::cout);
	std::ofstream fstr("output.txt");
	tee.addStream(fstr);
	tee << "Hello, world!" << std::endl;
	return 0;
}

3.4 空流

Poco::NullOutputStream:丢弃所有写入它的数据。
Poco::NullInputStream:表示每次读操作的文件结束。

3.5 二进制读写

Poco::BinaryWriter:用于将基本类型的值以二进制形式写入输出流。
Poco::BinaryReader:用于读取二进制形式的基本类型(由Poco::BinaryWriter产生)

两者都支持大端和小端字节顺序的写入和读取,以及自动字节顺序转换。这些类对于在不同体系结构的系统之间交换二进制数据非常有用。

#include "Poco/BinaryWriter.h"
#include "Poco/BinaryReader.h"
#include <sstream>
#include <iostream>


using Poco::BinaryWriter;
using Poco::BinaryReader;


int main(int argc, char** argv)
{
	std::stringstream str;

	BinaryWriter writer(str);
	writer << true
	       << 'x'
	       << 42
	       << 3.14159265
	       << "foo bar";

	bool   b;
	char   c;
	int    i;
	double d;
	std::string s;

	BinaryReader reader(str);
	reader >> b
	       >> c
	       >> i
	       >> d
	       >> s;

	std::cout << b << std::endl
	          << c << std::endl
	          << i << std::endl
	          << d << std::endl
	          << s << std::endl;

	return 0;
}

4、文件读写

POCO提供了用于读写文件的流类:FileStream, FileInputStream, FileOutputStream
头文件:#include “Poco/FileStream.h”

在Windows平台上,传递给文件流的路径是UTF-8编码的。
文件流总是以二进制模式打开。支持Seek。

#include "Poco/FileStream.h"

int main(int argc, char** argv)
{
	Poco::FileStream str("test.txt", std::ios::out | std::ios::trunc);
	str << "0123456789\n";
	str << "abcdefghij\n";
	str << "klmnopqrst\n";
	str.close();

	std::string s;
	str.open("test.txt", std::ios::in);
	std::getline(str, s);
	str.close();
}

5、自定义流

POCO提供了流缓冲类模板,简化了自定义流类的实现。
流是通过首先创建流缓冲类来实现的(streambuf),然后添加IOS, istream和ostream类。

可用的流缓冲类模板如下:

  • Poco::BasicUnbufferedStreamBuf:是实现自定义流的最简单方法。
  • Poco::BasicBufferedStreamBuf:必须为字符类型实例化的类模板。
  • Poco::BasicBufferedBidirectionalStreamBuf

子类需要重新实现以下函数

  • int readFromDevice():读取并返回单个(无符号)字节。如果没有更多可用的数据,返回char_traits::eof()(-1)。
    注意:永远不要直接返回char值,因为char可能是有符号的。始终使用int charToInt(char c)将字符转换为整数。
  • int writeToDevice(char c):写单个字节。如果成功返回字节(作为整数),否则char_traits::eof() (-1)
  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭老二

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值