From 5a337fd47a72e1cacf00e381126f87e4f81338a4 Mon Sep 17 00:00:00 2001 From: Kuoi Date: Mon, 20 Mar 2023 14:30:42 +0800 Subject: [PATCH] add: function checkaligned and format the arg --- main.cpp | 425 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 219 insertions(+), 206 deletions(-) diff --git a/main.cpp b/main.cpp index c966931..81ce952 100644 --- a/main.cpp +++ b/main.cpp @@ -2,14 +2,19 @@ #include #include #include -#include #include using namespace std; -int intype=0, outype=0; -char *fn; -char *otn; +class Basic_arg{ +public: + int intype=0, outype=0; + char *itn, *otn; + Basic_arg(int intype, int outype, char* itn, char *otn): + intype(intype), outype(outype), + itn(itn), otn(otn) + {}; +}; class Sample { public: @@ -20,77 +25,72 @@ public: taxas = new string[ntax]; chars = new string[ntax]; }; -// ~Sample(){ -// delete[] taxas; -// delete[] chars; -// } }; +Basic_arg procargs (int nargs, char ** arg, char* itn, char* otn); +Sample read_input(char* itn, int intype); void show_help(int help_num); -Sample read_input(); -Sample readFas(); -Sample readPhy(); -Sample readTnt(); -Sample readNex(); -void write_output(class Sample sam); -void writeFas(class Sample sam); -void writePhy(class Sample sam); -void writeTnt(class Sample sam); -void writeNex(class Sample sam); +Sample readFas(char* itn); +Sample readPhy(char* itn); +Sample readTnt(char* itn); +Sample readNex(char* itn); +void write_output(class Sample sam, char* otn, int outype); +void writeFas(class Sample sam, char* otn); +void writePhy(class Sample sam, char* otn); +void writeTnt(class Sample sam, char* otn); +void writeNex(class Sample sam, char* otn); bool isNum(string strnum); +bool checkalign(class Sample sam); string to_lower(string stri); string add_space(char x, string str_old); string checktype(string str); int countfre(string str, char c); - -Sample readPhy(){ +int checkextension(string str); + +Sample readPhy(char* itn){ //read file - ifstream seqfile; - seqfile.open(fn); + ifstream matrixfile; + matrixfile.open(itn); //read number of taxa and charcter string sntax, snseq, snall; - cout << "Reading from the file" << endl; - getline(seqfile,snall); + getline(matrixfile,snall); istringstream istr(snall); istr >> sntax; istr >> snseq; int ntax, nchar; ntax = stoi (sntax); nchar = stoi (snseq); // string to int - cout << "ntax=" << ntax << " nseq=" << nchar << endl; Sample sam(ntax, nchar); //read sequence int lennum; for(lennum=0;lennum> sam.taxas[lennum]; istr >> sam.chars[lennum]; - cout << "tax" << lennum << " is " << sam.taxas[lennum] << "; seq" << lennum << " is " << sam.chars[lennum] << endl; } - seqfile.close(); + matrixfile.close(); // return to class return sam; } -Sample readFas(){ +Sample readFas(char* itn){ int ntax, nchar, lnum; - ifstream seqfile; - seqfile.open(fn); + ifstream matrixfile; + matrixfile.open(itn); // check line number and taxa number ntax = 0; string temln; - for(lnum=0;getline(seqfile,temln);lnum++){ + for(lnum=0;getline(matrixfile,temln);lnum++){ if(temln[0]=='>'){ ntax++; } } - cout << "lnum= " << lnum << ", ntax= " << ntax << endl; - seqfile.clear(); - seqfile.seekg(0); + matrixfile.clear(); + matrixfile.seekg(0); // check the nchar string *str_a = new string; string *str_b = new string; int r = lnum/ntax; for (int i=0; i0){ *str_b = *str_b + *str_a; } @@ -100,42 +100,41 @@ Sample readFas(){ str_a = nullptr; delete str_b; str_b = nullptr; - cout << "ntax= " << ntax << ", nchar= " << nchar << endl; - seqfile.clear(); - seqfile.seekg(0); + matrixfile.clear(); + matrixfile.seekg(0); // create class Sample sam(ntax, nchar); // get class string *str_c = new string; for (int a=1, b=0;a<=lnum;a++){ if(a%r==1){ - getline(seqfile,sam.taxas[b]); + getline(matrixfile,sam.taxas[b]); sam.taxas[b].erase(0,1); } if(a%r>1){ - getline(seqfile,*str_c); + getline(matrixfile,*str_c); sam.chars[b] = sam.chars[b] + *str_c; } if(a%r==0){ - getline(seqfile,*str_c); + getline(matrixfile,*str_c); sam.chars[b] = sam.chars[b] + *str_c; b++; } } delete str_c; str_c = nullptr; - seqfile.close(); + matrixfile.close(); return sam; } -Sample readTnt(){ +Sample readTnt(char* itn){ int ntax, nchar; - ifstream seqfile; - seqfile.open(fn); + ifstream matrixfile; + matrixfile.open(itn); // get nchar and ntax string stri, sntax, snchar; for(int i=0;i<1;){ - getline(seqfile,stri); + getline(matrixfile,stri); istringstream istr(stri); istr >> snchar; istr >> sntax; if(isNum(sntax) && isNum(snchar)){ @@ -149,12 +148,11 @@ Sample readTnt(){ // get class int lennum; for(lennum=0;lennum> sam.taxas[lennum]; istr >> sam.chars[lennum]; - cout << "tax" << lennum << " is " << sam.taxas[lennum] << "; seq" << lennum << " is " << sam.chars[lennum] << endl; } - seqfile.close(); + matrixfile.close(); return sam; } @@ -164,90 +162,67 @@ bool isNum(string strnum) { return *p == 0; } -Sample readNex(){ +Sample readNex(char* itn){ int ntax, nchar; // open file - ifstream seqfile; - seqfile.open(fn); + ifstream matrixfile; + matrixfile.open(itn); // some tem string snall, stri, str_a, str_b; - bool found = false; - bool found_ntax = false; - bool found_nchar = false; - bool found_equal = false; + bool found = false, found_ntax = false, found_nchar = false, found_equal = false; char x = '='; - int lnum, e, eulnum; - e = 0; + int lnum, eulnum; // getline line by line - for(lnum=0;getline(seqfile,snall);lnum++){ + for(lnum=0;getline(matrixfile,snall);lnum++){ str_a = to_lower(snall); str_b = add_space(x,str_a); istringstream istr(str_b); // convert to words - // e will enter the ntax/nchar function just after statisfy the `=` while(istr>> stri){ if(stri=="dimensions"){ found = true; + } else if(stri=="ntax"){ + found_ntax = true; + } else if(stri=="nchar"){ + found_nchar = true; + } else if(stri=="="){ + found_equal = true; + } else if (found_ntax&&found_equal){ + if(stri.back()==';'){ + stri.pop_back(); + found = false; + } + ntax = stoi(stri); + found_equal = false; + found_ntax = false; + } else if (found_nchar&&found_equal){ + if(stri.back()==';'){ + stri.pop_back(); + found = false; + } + nchar = stoi(stri); + found_equal = false; + found_nchar = false; + } else if (stri=="matrix"){ + eulnum = lnum+1; } - - if(stri=="ntax"){ - found_ntax = true; - } - if(stri=="nchar"){ - found_nchar = true; - } - if(stri=="="){ - found_equal = true; - } - if (found_ntax&&found_equal){ - e++; - if(e>1){ - if(stri.back()==';'){ - stri.pop_back(); - found = false; - } - ntax = stoi(stri); - found_equal = false; - found_ntax = false; - e=0; - } - } - - if (found_nchar&&found_equal){ - e++; - if(e>1){ - if(stri.back()==';'){ - stri.pop_back(); - found = false; - } - nchar = stoi(stri); - found_equal = false; - found_nchar = false; - e=0; - } - } - if(stri=="matrix"){ - // get the position of matrix - eulnum = lnum+1; - } } } // go back - seqfile.clear(); - seqfile.seekg(0); + matrixfile.clear(); + matrixfile.seekg(0); // create class Sample sam(ntax,nchar); // some temp, z is line number, l is the string arrary number int z=0; int l=0; // read line by line - while(getline(seqfile,snall)){ + while(getline(matrixfile,snall)){ // convert to word istringstream istr(snall); // limit the read line number if(z>(eulnum-1)&&z<(eulnum+sam.ntax)){ istr >> sam.taxas[l]; istr >> sam.chars[l]; - cout << "tax" << l << " is " << sam.taxas[l] << "; seq" << l << " is " << sam.chars[l] << "; l=" << l << endl; l++; } z++; @@ -272,58 +247,43 @@ string to_lower(string stri){ return stri; } -void writeFas(class Sample sam){ - ofstream outputFile(otn); - if (outputFile.is_open()) { +void writeFas(class Sample sam, char* otn){ + ofstream matrixfile(otn); for(int i=0;i" << sam.taxas[i] << endl; - outputFile << sam.chars[i] << endl; + matrixfile << ">" << sam.taxas[i] << endl; + matrixfile << sam.chars[i] << endl; } - } else { - cout << "File can't be written" << endl; - } - outputFile.close(); + matrixfile.close(); } -void writePhy(class Sample sam){ - ofstream outputFile(otn); - if (outputFile.is_open()) { - outputFile << sam.ntax << " " << sam.nchar << endl; +void writePhy(class Sample sam, char* otn){ + ofstream matrixfile(otn); + matrixfile << sam.ntax << " " << sam.nchar << endl; for(int i=0;i0.7){ datatype = "dna"; } else if ((standard/str.length())>0.7){ @@ -352,107 +312,160 @@ int countfre(string str, char c){ return num; } -void writeTnt(class Sample sam){ - ofstream outputFile(otn); - if (outputFile.is_open()) { - outputFile << "xread" << endl << "\' \'" << endl; - outputFile << sam.nchar << " " << sam.ntax << endl; +void writeTnt(class Sample sam, char* otn){ + ofstream matrixfile(otn); + matrixfile << "xread" << endl << "\' \'" << endl; + matrixfile << sam.nchar << " " << sam.ntax << endl; for(int i=0;i