【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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/236951.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【每日一题】最小体力消耗路径

文章目录 Tag题目来源解题思路方法一&#xff1a;二分枚举答案 写在最后 Tag 【二分枚举答案】【图】【2023-12-11】 题目来源 1631. 最小体力消耗路径 解题思路 拿到这个题目&#xff0c;计算从左上角到右下角的最小体力消耗值&#xff0c;有点像 64. 最小路径和。在 64 题…

散点图直方图折线图的替代

散点图直方图折线图的替代 seaborn官网 数据科学数据可视化&#xff0c;散点图 直方图 折线图的新方法 1.hexbinplot https://seaborn.pydata.org/examples/hexbin marginals.html相当于散点图做了聚合/分箱&#xff0c;使数据的分布展示更明显。Library: seaborn 2.瀑布图展示…

Linux 驱动开发需要掌握哪些编程语言和技术?

Linux 驱动开发需要掌握哪些编程语言和技术&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「Linux从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xf…

图论专栏一《图的基础知识》

图论&#xff08;Graph Theory&#xff09;是数学的一个分支。它以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形&#xff0c;这种图形通常用来描述某些实体之间的某种特定关系&#xff0c;用点代表实体&#xff0c;用连接两点的线表示两个实体间具有的…

OpenVINS学习2——VIRAL数据集eee01.bag运行

前言 周末休息了两天&#xff0c;接着做上周五那个VIRAL数据集没有运行成功的工作。现在的最新OpenVINS需要重新写配置文件&#xff0c;不像之前那样都写在launch里&#xff0c;因此需要根据数据集情况配置好estimator_config.yaml还有两个标定参数文件。 VIRAL数据集 VIRAL…

从零开始实现神经网络(三)_RNN循环神经网络

参考文章&#xff1a;rnn循环神经网络介绍 循环神经网络 &#xff08;RNN&#xff09; 是一种专门处理序列的神经网络。它们通常用于自然语言处理 &#xff08;NLP&#xff09; 任务&#xff0c;因为它们在处理文本方面很有效。在这篇文章中&#xff0c;我们将探讨什么是 RNN&a…

【简易版】Linux下Protobuf 实现网络版通讯录--C++

一、介绍 该项目的主要目的是用于熟悉protobuf的使用&#xff0c;体验数据在网络中序列化反序列化的形式&#xff0c;并非一个完整的项目。 该通讯录只实现了增加联系人的功能。服务器端接收到请求后会将联系人的信息打印。 二、环境搭建 使用Httplib库&#xff0c;可以快速…

【ClickHouse】ClickHouse与MySQL之间实时同步数据(MySQL引擎),将MySQL数据实时同步到clickhouse

参考1:MySQL(通过该配置实现了实时同步) 参考2:experimental MaterializedMySQL 参考3:[experimental] MaterializedMySQL(包含设置 allow_experimental_database_materialized_mysql) MySQL引擎用于将远程的MySQL服务器中的表映射到ClickHouse中&#xff0c;并允许您对表进行I…

亚信科技AntDB携手蓝凌软件,助推企业数字化办公转型升级

随着企业数字化转型的深入&#xff0c;企业对于协同办公、移动门户、数字运营、智能客服等方面的需求越来越高&#xff0c;数智化正成为催生新动能和新优势的关键力量。数字化的办公平台可以帮助企业实现各类信息、流程的集中化、数字化和智能化管理&#xff0c;为企业管理者提…

2-7、转义字符

语雀原文链接 文章目录 1、转义字符2、\r\n的遗留问题3、System 1、转义字符 \r 回车&#xff0c;将光标定位在当前行的开头&#xff0c;不会跳到下一行。return\n 换行符&#xff0c;将光标定位在下一行的开头。newline 2、\r\n的遗留问题 我们在平时使用电脑时&#xff0c…

Mybatis是如何进行分页的?

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一份大厂面试资料《史上最全大厂面试题》&#xff0c;Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

WRF--修改geo_em.d01.nc中的变量,保持其他信息不变

WRF–修改geo_em.d01.nc中的变量&#xff0c;保持其他信息不变 首先呢&#xff0c;找到编译WRF过程中自带的读取nc的一个fortran函数&#xff1a;read_wrf_nc.f90 可以使用Linux命令&#xff1a; find / -name read_wrf_nc.f90 找到之后&#xff0c;修改这个文件&#xff0c…

镜头驱动芯片选型 GC6236,GC6208,GC6209的型号分析,多应用于摄像机镜头,家庭监控云台驱动等产品中

国产芯片GC6236&#xff0c;GC6208&#xff0c;GC6209 为5V摄像机镜头驱动芯片&#xff0c;电压范围在3~5.5(V)&#xff0c;最大持续电流可达0.8(A)最高工作温度在-40~100之间。其特点都具有5V多通道&#xff0c;低噪步进电机驱动和霍尔自动光圈驱动等。可应用在摄像机镜头,家庭…

【SpringBoot教程】SpringBoot 统一异常处理(附核心工具类-ErrorInfoBuilder)

作者简介&#xff1a;大家好&#xff0c;我是撸代码的羊驼&#xff0c;前阿里巴巴架构师&#xff0c;现某互联网公司CTO 联系v&#xff1a;sulny_ann&#xff08;17362204968&#xff09;&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗…

如何通过SPI控制Peregrine的数控衰减器

概要 Peregrine的数控衰减器PE4312是6位射频数字步进衰减器(DSA,Digital Step Attenuator)工作频率覆盖1MHz~4GHz,插入损耗2dB左右,衰减步进0.5dB,最大衰减量为31.5dB,高达59dBm的IIP3提供了良好的动态性能,切换时间0.5微秒,供电电源2.3V~5.5V,逻辑控制兼容1.8V,20…

访问控制列表ACL学习

ACL概念 ACL: ACL 是 Access Control List&#xff08;访问控制列表&#xff09;的缩写。它是一种用于管理和控制访问权限的机制或数据结构。ACL 用于确定谁可以访问特定资源&#xff08;例如文件、文件夹、网络资源等&#xff09;以及他们可以执行的操作。ACL 通常由一系列访…

基于SSM的高校共享单车管理系统的设计与实现论文

摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就很关键。因此高校单车租赁信…

【UE5.1】Mixamo动画重定向到MetaHuman

前言 在上一篇博客&#xff08;【UE5】初识MetaHuman&#xff09;中我们创建一个MetaHuman角色&#xff0c;本篇博客在此基础上继续实现Mixamo动画重定向到MetaHuman角色的过程。 效果 步骤 1. 下载Mixamo动画资源&#xff08;网盘链接&#xff1a;百度网盘&#xff09;&…

算法分析与设计题目和参考代码

注&#xff1a;以下题目与代码来源于各种渠道 算法与分析设计 第0章 C常用函数与头文件1. 算法 #include \<algorithm\>2. 栈 #include \<stack\>3. 队列 #include \<queue\>4. 优先队列 #include \<queue\>5. map #include \<map\> 第一章 概论…
最新文章