2013-10-15 303 views
1

我已經知道恆立這個庫有一段時間了,但是我到現在還沒有嘗試過使用它,主要是因爲直到現在python對我來說足夠快。如何使用kseq.h解析FASTA文件

這裏是鏈接到報頭:用於長度爲序列行http://lh3lh3.users.sourceforge.net/kseq.shtml

當我嘗試使用以下方法來解析的fasta文件,則返回-1。我查看了李的代碼,這似乎主要是爲了FASTQ解析而設計的,但他在他的網頁上說過它也支持FASTA格式。

這裏是我的代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include "kseq.h" 
// STEP 1: declare the type of file handler and the read() function 
KSEQ_INIT(FILE*, read) 


int main(int argc, char** argv) { 
    FILE* fp = fopen(argv[1], "r"); // STEP 2: open the file handler 
    kseq_t *seq = kseq_init(fp); // STEP 3: initialize seq 

    int l; 

    while ((l = kseq_read(seq)) >= 0) { // STEP 4: read sequence 
     printf("name: %s\n", seq->name.s); 
     if (seq->comment.l) printf("comment: %s\n", seq->comment.s); 
     printf("seq: %s\n", seq->seq.s); 
     if (seq->qual.l) printf("qual: %s\n", seq->qual.s); 
    } 

    printf("return value: %d\n", l); 
    kseq_destroy(seq); // STEP 5: destroy seq 
    fclose(fp); 

    return (0); 
} 

我一直在使用與測試的FASTA可從多種來源,包括博德研究所的Hg19 GRCH37 ChrY.fa文件。

任何幫助,將不勝感激。

回答

5

首先,你應該檢查fopen()函數的返回值:

FILE* fp = fopen(argv[1], "r"); // STEP 2: open the file handler 
if(fp == 0) { 
    perror("fopen"); 
    exit(1); 
} 

其次,我看了一下頭文件,我認爲kseg_init需要一個FD不是FILE *。 你可以用fileno()從FILE *獲得一個fd。

kseq_t *seq = kseq_init(fp); // STEP 3: initialize seq 

應該是:

kseq_t *seq = kseq_init(fileno(fp)); // STEP 3: initialize seq 
+0

這似乎已經解決了這個問題的完整代碼。謝謝查理。如果我有更多的代表,我會upvote :) – N1ght

+0

我收到以下錯誤'從kseq_test.1.c包含文件:3:0: kseq_test.1.c:函數'ks_getc': kseq_test.1.c :5:18:警告:隱式聲明函數'read';你的意思是'fread'? [-Wimplicit-function-declaration]' – viz12

+0

@ viz12你應該用可讀的格式發佈一個新的問題,包括你的源代碼,命令行和錯誤信息。 –

0

這裏是爲我工作

#include <zlib.h> 
#include <stdio.h> 
#include "kseq.h" 
KSEQ_INIT(int, read) 

int main(int argc, char **argv) 
{ 
     FILE* fp; 
     kseq_t *seq; 
     int n = 0, slen = 0, qlen = 0; 
     fp = fopen(argv[1], "r"); 
     seq = kseq_init(fileno(fp)); 
     while (kseq_read(seq) >= 0) 
       ++n ;//slen += seq->seq.l, qlen += seq->qual.l; 
     printf("%d\t%d\t%d\n", n, slen, qlen); 
     kseq_destroy(seq); 
     fclose(fp); 
     return 0; 
}