c使用htslib库按奇偶行输出bam文件的内容
处理bam文件的时候,为了完成自己的需求,需要编写程序,调用htslib库中的api完成相应的功能。
bam文件是以二进制形式存储的文件,与普通的文件不同,所以在处理bam文件的时候,不能把它当做普通文件一样处理,需要利用htslib里的api对它进行操作。以下就是实现本次需求的代码。
#include <stdio.h>
#include <stdlib.h>
#include "htslib/sam.h"
#define bam_is_read1(b) (((b)->core.flag&BAM_FREAD1) != 0)
int main(int argc,char **argv)
{
bam_hdr_t *header;
bam1_t *aln = bam_init1();
samFile *in = sam_open(argv[1], "r");
htsFile *outR1 = hts_open(argv[2], "wb");
htsFile *outR2 = hts_open(argv[3], "wb");
header = sam_hdr_read(in);
if (sam_hdr_write(outR1, header) < 0) {
fprintf(stderr, "Error writing output.\n");
exit(-1);
}
if (sam_hdr_write(outR2, header) < 0) {
fprintf(stderr, "Error writing output.\n");
exit(-1);
}
int i=1;
while (sam_read1(in, header, aln) >= 0) {
if (i%2 != 0){
int a=sam_write1(outR1, header, aln);
}
else{
int a=sam_write1(outR2, header, aln);
}
i++;
}
sam_close(in);
sam_close(outR1);
sam_close(outR2);
}
这是原本bam文件中的内容。
编译执行程序之后,可以查看生成文件中的内容。
对于程序中用到的api,可以在samtools中的bam.h文件中找到相应的说明,也可以去下面给出的网站上查看http://samtools.sourceforge.net/samtools/masterTOC.shtml。