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