2012-04-04 2 views
0

У меня есть два FASTA файла:объединение двух FASTA файлов в C++

file1.fasta

>foo 
ATCGGGG 
>bar 
CCCCCC 

file2.fasta

>qux 
ATCGGAAA 

То, что я хочу сделать сейчас, чтобы конкатенации их в один файл, который дает результаты:

>foo 
ATCGGGG 
>bar 
CCCCCC 
>qux 
ATCGGAAA 

Таким образом, сохранение имени каждой последовательности, начинающейся с «>». В настоящее время мой код ниже заменить это имя с индексом, а именно:

>0 
ATCGGGG 
>1 
CCCCCC 
>0 
ATCGGAAA 

Что такое правильный способ изменить свой код ниже?

#include <iostream> 
#include <vector> 
#include <fstream> 
#include <sstream> 
#include<stdio.h> 
#include<string> 
using namespace std; 
#define MAX_LINE_SIZE 1024 

int mk_joint_file(char *ctrlFile, char *tgtFile, char *outFile){ 

    char s[MAX_LINE_SIZE]; 

    FILE *ofp = fopen(outFile,"w"); 
    FILE *cfp = fopen(ctrlFile,"r"); 
    FILE *tfp = fopen(tgtFile,"r"); 


    // char *p; 
    int flg=false; 
    int line=0; 
    while(fgets(s,MAX_LINE_SIZE,cfp) != NULL){ 
     if(s[0]=='>'){ 
      flg=true; 
      fprintf(ofp,">%d\n",line); 
      line++; 
     }else{ 
      if(flg==true){ 
       fprintf(ofp,"%s",s); 
      } 
      flg=false; 
     } 
    } 

    flg=false; 
    line=0; 
    while(fgets(s,MAX_LINE_SIZE,tfp) != NULL){ 
     if(s[0]=='>'){ 
      flg=true; 
      fprintf(ofp,">%d\n",line); 
      line++; 
     }else{ 
      if(flg==true) 
       fprintf(ofp,"%s",s); 
      flg=false; 
     } 
    } 

    fclose(cfp); 
    fclose(tfp); 
    fclose(ofp); 


    return(0); 
} 

int main(int argc, char **argv) 
{ 
    string ifname_control = argv[1]; 
    string ifname_target = argv[2]; 
    string ofname = "newjoin.txt"; 
    mk_joint_file((char *)ifname_control.c_str(), (char *)ifname_target.c_str(), (char *)ofname.c_str()); 

} 
+1

вам нужно написать программу Do для этого? Вы можете объединить два текстовых файла из командной строки/оболочки. В командной строке Windows вы можете просто сказать «copy file1.fasta + file2.fasta newjoin.txt». – Blastfurnace

ответ

1

Это тяжелее, чем просто изменение этих линий

fprintf(ofp,">%d\n",line); 

в

// TODO check fgets() handling of EOL - may not need the \n 
fprintf(ofp, %s\n", s); 
1

просто изменить линию 29 и от 40 до fprintf(ofp,"%s",s);

Смежные вопросы