您的位置:首页 > 编程语言 > C语言/C++

C语言读取fasta格式

2017-02-17 22:48 316 查看
一开始用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()释放内存
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C malloc free fasta