【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.hqwc.cn/news/266367.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Javaweb之前端工程打包部署的详细解析

6 打包部署 我们的前端工程开发好了&#xff0c;但是我们需要发布&#xff0c;那么如何发布呢&#xff1f;主要分为2步&#xff1a; 前端工程打包 通过nginx服务器发布前端工程 6.1 前端工程打包 接下来我们先来对前端工程进行打包 我们直接通过VS Code的NPM脚本中提供的…

Javascript 数组array赋值与取值

Javascript 数组array赋值与取值 目录 Javascript 数组array赋值与取值 一、数组元素的赋值 1、在创建Array对象时直接赋值 2、利用Array对象的元素下标对数组进行赋值 二、数组元素的获取 一、数组元素的赋值 对数组元素赋值共有2种方法&#xff1a; &#xff08;1&am…

Viewport Meta 标记:让网页适应各种设备的魔法符号

在我们用手机或平板电脑浏览网页时&#xff0c;你是否曾发现有些网页能够很好地适应屏幕&#xff0c;而有些却需要左右滑动才能完整显示内容&#xff1f;这就涉及到一个神奇的东西——Viewport Meta 标记。 最近本人在研究自适应的各自实现方法&#xff0c;比如media媒体查询、…

【jitterbuffer】2:OnCompleteFrameCallback 送去FrameBuffer 处理的流程

【jitterbuffer】2:OnCompleteFrameCallback 送去FrameBuffer 处理的流程 基于m98版本。 WebRtc Video Receiver(六)-FrameBuffer原理 大神有个详细的论述。 Finder的FID设计 H.264 没有FID,使用RtpSeqNumOnlyRefFinder ,比较复杂,要做出决定 RtpSeqNumOnlyRefFinder cla…

Linux(17):认识与分析登录档

什么是登录档 【详细而确实的分析以及备份系统的登录文件】是一个系统管理员应该要进行的任务之一。 登录档 就是记录系统活动信息的几个文件&#xff0c;例如&#xff1a;何时、何地(来源IP)、何人(什么服务名称)、做了什么动作(讯息登录啰)。 换句话说就是&#xff1a;记录系…

这样的软件测试面试题,谁面试遇到谁淘汰!!!

88 11.6 自动化测试用例的来源 手工编写测试用例 把原来手工的测试用例&#xff0c;当成自动化测试用例 11.7 自动化测试的优点与缺点 优点: 1、对程序的回归测试更方便 2、可以运行更多更繁琐的测试 3、提高测试效率和准确性&#xff0c;节约时间成本 4、可以执行一些手工测试…

【力扣】234.回文链表

嗯&#xff0c;今天这道题是我自己写的哦~&#xff0c;哒哒哒。今天还是很不错滴~ 234.回文链表 说一下我的解题思路&#xff0c;首先我的想法很简单就是将这个链表反转&#xff0c;然后将反转之后的链表与原链表进行对比。相等就返回true,不相等就返回false。所以我就想到了昨…

ArkTS入门

代码结构分析 struct Index{ } 「自定义组件&#xff1a;可复用的UI单元」 xxx 「装饰器&#xff1a;用来装饰类结构、方法、变量」 Entry 标记当前组件是入口组件&#xff08;该组件可被独立访问&#xff0c;通俗来讲&#xff1a;它自己就是一个页面&#xff09;Component 用…

数据结构之----算法简单介绍

数据结构之----算法简单介绍 什么是算法&#xff1f; 算法是指在有限的时间内得出想要的结果的一组指令或者是操作步骤。 算法特性&#xff1a; 问题是明确的&#xff0c;包含清晰的输入和输出定义。具有可行性&#xff0c;能够在有限步骤、时间和内存空间下完成。各步骤都…

说说您见过最惊艳的sql语句是什么?

【关注微信公众号&#xff1a;跟强哥学SQL&#xff0c;回复“笔试”免费领取大厂SQL笔试题。】 前几天偶然在知乎上刷到一个有趣的问题&#xff1a;请问您见过最惊艳的sql查询语句是什么&#xff1f; 这个问题的浏览量竟然高达139.8万&#xff01; 看到这个问题&#xff0c;我…

Python中的【yield】关键字:让【函数】变身成为【生成器】

引言 在Python中&#xff0c;yield是一个非常重要的关键字&#xff0c;它允许我们将一个函数变成一个生成器。生成器是一个非常有用的工具&#xff0c;可以按需生成数据&#xff0c;节省内存空间&#xff0c;并且在处理大数据集时特别有效。在本文中&#xff0c;小编将深入探讨…

教师们如何一对一私发成绩?

在传统的教育中&#xff0c;老师通常会通过班级群或家长会等方式发布学生的成绩信息。然而&#xff0c;这种公开的方式可能会让一些学生感到尴尬和不安&#xff0c;因为他们可能不愿意让其他人知道他们的成绩情况。为了解决这个问题&#xff0c;今天我就给老师们推荐一款免费的…