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

news2024/12/26 22:45:31

【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.coloradmin.cn/o/1302826.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

苹果文本动态高亮,滚动时候部分高亮不显示问题

很简单的需求&#xff1a; 一个文本容器固定大小&#xff0c;内容超出滚动&#xff0c;然后文本点击高亮&#xff0c;奇怪就是苹果微信打开会出现点击只会高亮能看见的区域文本&#xff0c;滚动部分不会显示&#xff0c;默认浏览器打开也不行&#xff0c;安卓没问题&#xff0…

10.RIP路由信息协议

10.RIP 网段经常产生变化的话&#xff0c;建议使用动态路由协议&#xff0c;当网段发生变化的时候会自动通告给其他路由器 它不看链路的带宽&#xff0c;只看链路中的跳数&#xff0c;只要是跳数多的&#xff0c;不管带宽有多大&#xff0c;它就认为是不好的 RIP跳数有限 …

外包干了3个月,技术退步明显。。。

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

第三节、项目支付功能实战-微信支付平台接入流程,小程序账号注册、商户注册

简介 本篇介绍小程序的注册流程、商户平台的注册流程、以及小程序和商户平台如何进行绑定。 微信小程序注册 由于项目中使用了小程序进行支付&#xff0c;所以首先来注册小程序。小程序注册网站如下&#xff1a;小程序注册地址 小程序账号注册 1、链接页面点击“前往注册”…

事务的四个特性、四个隔离级别以及数据库的常用锁

事务的四个特性、四个隔离级别以及数据库的常用锁 四大特性 事务的四大特性&#xff0c;通常被称为ACID特性&#xff0c;是数据库管理系统&#xff08;DBMS&#xff09;确保事务处理的关键属性。这四大特性分别是&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#x…

银河麒麟v10系统SSH远程管理及切换root用户的操作方法

&#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Linux》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一…

Python基础期末复习 新手 2

虽然age 10在__init__方法中定义了一个局部变量age&#xff0c;但这个局部变量并不会影响类属性age的值。类属性是在类级别上定义的&#xff0c;不属于任何一个实例。因此&#xff0c;在创建实例s1和s2时&#xff0c;它们的age属性值都为类属性的初始值0。 尽管对类的属性值进…

1.鸿蒙应用程序开发app_hap开发环境搭建

1.下载Node.js, Javascipts的运行环境 node.js版本下载v12.18.3/https://www.cnblogs.com/txwtech/p/17865780.html 2.下载并安装DevEco Studio DevEco Studio 3.1 DevEco Studio 3.1配套支持HarmonyOS 3.1版本及以上的应用及服务开发&#xff0c;提供了代码智能编辑、低代…

coding创建远程分支。并拉取远程新分支+推送代码

进入coding ----项目----代码仓库---点击 下拉之后查看全部----创建分支 创建分支之后执行下面命令 git branch -a // 查看所有分支 这个时候发现自己创建的分支没有显示这是因为自己在远程创建了分支但是本地还没有分支 执行 git fetch命令 用于从远程仓库获取最新的提交…

day33-37-SpringBootV12(整合Spring,SpringMVC,Mybatis,日志,api测试等框架)

ssm spring --> applicationContext.xml配置文件 springmvc --> springmvc.xml配置文件 mybatis —> mybatis-config.xml配置文件 —> springboot优化了之前的框架配置,思想是约定大于配置 一、引言 1.1 初始化配置 为了使用SSM框架去开发&#xff0c;准备SSM…

SpringBootWeb请求响应之前言及状态码的详细解析

SpringBootWeb请求响应 前言 在上一次的课程中&#xff0c;我们开发了springbootweb的入门程序。 基于SpringBoot的方式开发一个web应用&#xff0c;浏览器发起请求 /hello 后 &#xff0c;给浏览器返回字符串 “Hello World ~”。 其实呢&#xff0c;是我们在浏览器发起请求…

孩子还是有一颗网安梦——Bandit通关教程:Level0

&#x1f575;️‍♂️ 专栏《解密游戏-Bandit》 &#x1f310; 游戏官网&#xff1a; Bandit游戏 &#x1f3ae; 游戏简介&#xff1a; Bandit游戏专为网络安全初学者设计&#xff0c;通过一系列级别挑战玩家&#xff0c;从Level0开始&#xff0c;逐步学习基础命令行和安全概念…

JAVA定时任务技术总结

在日常的项目开发中&#xff0c;多多少少都会涉及到一些定时任务的需求。例如每分钟扫描超时支付的订单&#xff0c;每小时清理一次数据库历史数据&#xff0c;每天统计前一天的数据并生成报表&#xff0c;定时去扫描某个表的异常信息&#xff08;最终一致性的方案也可能涉及&a…

五.单行函数

单行函数 1.函数的理解1.1什么是函数1.2不同DBMS函数的差异1.3MySQL的内置函数分类 2.数值函数2.1基本函数2.2角度与弧度互换函数2.3三角函数2.4指数与对数2.5进制间的转换 3.字符串函数4.日期和时间函数4.1获取日期、时间4.2日期与时间戳的转换4.3获取月份、星期、星期数、天数…

CentOS上配置和管理HTTP服务器的工具和实用程序

在CentOS系统上&#xff0c;有多个工具和实用程序可以帮助你配置和管理HTTP服务器。以下是一些常用的工具和实用程序&#xff1a; Apache HTTP服务器&#xff1a; Apache是CentOS上最常用的HTTP服务器之一。它是一个开源的Web服务器软件&#xff0c;具有高度的可配置性和可扩…

西工大网络空间安全学院计算机系统基础实验二(phase_2上——死寂的长夜)

自从西工大网络空间安全学院计算机系统基础实验二&#xff08;清楚实验框架及phase_1&#xff09;-CSDN博客这篇文章之后&#xff0c;我们获取了phase_1的答案字符串&#xff0c;如 图1&#xff1a;phase_1的答案字符串 所示&#xff0c;注意每个人的答案字符串可能都不一样。接…

将程序注册为系统服务

cmd中执行命令&#xff1a; sc create Redis binpath "C:\guet_run1\Redis-x64-5.0.14.1\redis-server.exe" type own start auto displayname "Redis"注意&#xff0c;命令中所有的等号和值之间需要一个空格&#xff08;等号前不要空格&#xff0c;等号后…

论文怎么改才能降低重复率

一、引言&#xff1a;智能工具助力&#xff0c;轻松降低论文重复率 论文的重复率是学术写作中的重要问题&#xff0c;如何有效降低重复率成为了许多研究者的关注焦点。如今&#xff0c;智能工具的发展为我们提供了更多选择。本文将介绍几种实用的智能工具&#xff0c;包括快码…

(附源码)基于ssm校园体育设施管理系统小程序-计算机毕设 70715

ssm校园体育设施管理系统小程序 摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;校园体育设施管理系统小程…

zookeeper2==zookeeper源码阅读,集群如何选举出LEADER

上一篇已经搭建好了环境&#xff0c;这篇研究下集群是怎么进行选举的。 源码分析&#xff1a; 首先将三台机器的data目录下除了myid之外的都清掉&#xff0c;从零开始启动。 先启动ZK1 然后顺着main阅读源码 org.apache.zookeeper.server.quorum.QuorumPeer#start org.apac…