2012-04-04 96 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

你需要编写一个程序为了这?您可以连接命令行/ shell中的两个文本文件。在Windows命令提示符处,您可以说'copy file1.fasta + file2.fasta newjoin.txt'。 – Blastfurnace 2012-04-04 03:29:26

回答

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);