首页 > 代码库 > C语言读取fasta格式

C语言读取fasta格式


一开始用fopen  读取文件的时候 总是返回Null   

Can‘t open (null) for reading.   原因是最后一个参数后面有“\n”


对于fasta序列有多行的情况,需要把字符串连接, 这在perl 或 python里面都比较容易实现;

在C里面也可以实现, 有个strcat函数, 这里还有一种方法是自定义连接字符串的函数


例一

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define LINE 4096

void rtrim(char *str){
  char *s;
  s = str + strlen(str);
  while (--s >= str) {
    if (!isspace(*s)) break;
    *s = 0;
  }
}


int main(int argc, char * argv[]){
    void rtrim(char *str);
    FILE *in;
    char *T1 = (char*)malloc(sizeof(char) *LINE);
    int i, a, seq_len, seq_number = 0;
    char fa[10240] = "";
    
    for (i = 1; i < argc; i++){
        printf("%s\n",argv[i]);
        rtrim(argv[i]);
        in = fopen(argv[i], "r");
        if ( in == NULL){
            printf ("Can‘t open %s for reading.\n", argv[i]);
            return 1;
        }
        while(!feof(in)){
            fgets(T1, LINE, in);
            if (T1[0] != ‘>‘ ){
                
                rtrim(T1);
                strcat(fa, T1);
            } else {
                seq_number ++;
                if(seq_number > 1){
                    printf("%s\n",fa);
                }
                printf ("%s",T1);
                memset(fa,0, 10240);
            }
        }

        printf("%s\n",fa);
        fclose(in);
        free(T1);
    }
    return 0;
}


例二

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define LINE 4096

void rtrim(char *str){
  char *s;
  s = str + strlen(str);
  while (--s >= str) {
    if (!isspace(*s)) break;
    *s = 0;
  }
}

void concatStr(char *a, char *b){
        while(*a++);
        a--;
        while((*a++ = *b++)!=‘\0‘);
}

int main(int argc, char * argv[]){
    void rtrim(char *str);
    void concatStr(char *a, char*b);
    FILE *in;
    char *T1 = (char*)malloc(sizeof(char) *LINE);
    int i, a, seq_len, seq_number = 0;
    char *pfa = (char*)malloc(sizeof(char) * 10240);
    
    for (i = 1; i < argc; i++){
        printf("%s\n",argv[i]);
        rtrim(argv[i]);
        in = fopen(argv[i], "r");
        if ( in == NULL){
            printf ("Can‘t open %s for reading.\n", argv[i]);
            return 1;
        }
        while(!feof(in)){
            fgets(T1, LINE, in);
            if (T1[0] != ‘>‘ ){

                rtrim(T1);
                concatStr(pfa, T1);
                
            } else {
                seq_number ++;
                if(seq_number > 1){
                    printf("%s\n",pfa);
                }
                printf ("%s",T1);
                memset(pfa,0, 1024);
            }
        }

        printf("%s\n",pfa);
        fclose(in);
        free(T1);
        free(pfa);
    }
    return 0;
}


两个共同点是 都要用memset对指针清零, 不同点是第一个不用free(), 第二个要用free()释放内存

本文出自 “R和Python应用” 博客,请务必保留此出处http://matrix6ro.blog.51cto.com/1746429/1898975

C语言读取fasta格式