diff --git a/main.cpp b/main.cpp index 6778275..0af6c32 100644 --- a/main.cpp +++ b/main.cpp @@ -30,17 +30,18 @@ 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 writeNexus(class Sample sam); +void writeNex(class Sample sam); +bool isNum(string strnum); +string to_lower(string stri); +string add_space (char x, string str_old); Sample readPhy(){ -// unsigned ntax, nchar; -// string *taxas, *chars; -// Sample sam(ntax, nchar); - int num=0; //read file ifstream seqfile; seqfile.open(fn); @@ -71,6 +72,7 @@ Sample readFas(){ int ntax, nchar, lnum; ifstream seqfile; seqfile.open(fn); + // check line number and taxa number ntax = 0; string temln; for(lnum=0;getline(seqfile,temln);lnum++){ @@ -81,7 +83,7 @@ Sample readFas(){ cout << "lnum= " << lnum << ", ntax= " << ntax << endl; seqfile.clear(); seqfile.seekg(0); - + // check the nchar string *str_a = new string; string *str_b = new string; int r = lnum/ntax; @@ -96,12 +98,12 @@ Sample readFas(){ str_a = nullptr; delete str_b; str_b = nullptr; - cout << "ntax= " << ntax << ", nchar= " << nchar << endl; seqfile.clear(); seqfile.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){ @@ -121,19 +123,153 @@ Sample readFas(){ delete str_c; str_c = nullptr; seqfile.close(); - int lennum; - for(lennum=0;lennum> snchar; istr >> sntax; + if(isNum(sntax) && isNum(snchar)){ + ntax=stoi(sntax); + nchar=stoi(snchar); + i++; + } + } + // create class Sample sam(ntax,nchar); + // 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(); return sam; } +bool isNum(string strnum) { + char* p; + strtol(strnum.c_str(), &p, 10); + return *p == 0; +} + +Sample readNex(){ + int ntax, nchar; + // open file + ifstream seqfile; + seqfile.open(fn); + // some tem + string snall, stri, str_a, str_b; + bool found = false; + bool found_ntax = false; + bool found_nchar = false; + bool found_equal = false; + char x = '='; + int lnum, e, eulnum; + e = 0; + // getline line by line + for(lnum=0;getline(seqfile,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; + } + + 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); + // 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)){ + // 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++; + } + return sam; +} +string add_space (char x, string str_old) { + int i; + string str_new; + for (i=0; i