C++ 同时处理文本文件和 gz 文件
我们通常可以这样遍历一个文本文件:
#include <iostream>
#include <string>
using namespace std;
int main() {
const char *filename = "some.fq";
ifstream infile(filename);
string line;
long n = 0;
while (getline(infile, line)) {n++;}
cout << n << endl;
infile.close();
return 0;
}
gzstream 库提供了和上面非常类似的读写 gz 文件的方式。
首先我们安装这个库:https://www.cs.unc.edu/Research/compgeom/gzstream/。
可以装到系统默认路径中,也可以直接放到我们需要用的项目下面。
下载已经编译好的 gzstream,解压后可以在里面找到这两个文件:
- gzstream.h: 用于写脚本时引入
- libgzstream.a: 用于编译我们的脚本
基本用法:
#include <iostream>
#include <string>
#include "gzstream/gzstream.h"
using namespace std;
int main() {
const char *filename = "some.fa.gz";
igzstream infile(filename);
string line;
long n = 0;
while (getline(infile, line)) {n++;}
cout << n << endl;
infile.close();
return 0;
}
这里我们将 gzstream 解压到测试脚本的同级目录:
|-- test.cc
|-- gzstream/
|-- gzstream.h
|-- libgzstream.a
然后编译链接:
g++ test.cc -L./gzstream -lgzstream -lz -o test.exe
然后执行:
./test.exe
知识点:
-L/path/to/lib
指定静态库或者动态库文件所在的位置,可以是相对路径-lxxx
指定静态库或者动态库的名称,例如- 系统提供的库一般都有简称,例如
-lz
表示链接到 zlib 库 - gzstream 提供的静态库是 libgzstream.a,去掉 lib- 前缀和 .a 后缀就是我们需要填写的库名
- 系统提供的库一般都有简称,例如
评论区