一开始用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()释放内存
转载于:https://blog.51cto.com/matrix6ro/1898975