io - Treat a space(or tab) separated file "like" and array - C++ -
i have short tab/space separated file (i can create accordingly) structure
[data00] <space> [data01] <space> [data02] <space> [data03] <newline> [data10] <space> [data11] <space> [data12] <space> [data13] <newline> ... the first column representing numerical id. create file feed executable, format fixed. after feeding it, executable outputs file similar structure:
[data00] <space> [data01]<newline> [data10] <space> [data11]<newline> ... given id, need read corresponding [datax1], perform operations on [datax3] in first file, feed executable, , iterate.
i think of 2 way of doing this:
- operate on 2 textfile "as if" array, given structure fixed, lost on function/syntax use. should small function allow me read interesting bit passing relevant numeric id hiding pesky i/o code, need repeat operation lot in different context
- keep first file in arrays , trick executable feeding stream (is possible? executable expects file argument).
i read files arrays , write files anew each time, want avoid useless read , write operation, when need read/write 1 cell each time. don't how how stop/identify interest bit when read whole line text file using,say, getline.
first write function split inputted string based upon given separator. (in case use space.)
int split(const std::string& line, const std::string& seperator, std::vector<std::string> * values){     std::string tstring = "";     unsigned counter = 0;     for(unsigned l = 0; l < line.size(); ++l){         for(unsigned = 0; < seperator.size(); ++i){             if(line[l+i]==seperator[i]){                 if(i==seperator.size()-1){                     values->push_back(tstring);                     tstring = "";                     ++counter;                 }else continue;             }else{                 tstring.push_back(line[l]);                 break;             }         }     }     return counter; } now write ourselves simple main read file, use split break up, , output data based upon location within file.
int main(){     std::vector<std::vector<std::string> > lines;     std::string tstring = "";     std::vector<std::string> tvector;     std::ifstream filetoload;      filetoload.open(file_name);      if(filetoload.is_open()){         while(std::getline(filetoload,tstring)){             split(tstring, " ", &tvector);             lines.push_back(tvector);             tvector.clear();         }          //now print our output.         for(unsigned i1 = 0; i1 < lines.size(); ++i1){             for(unsigned i2 = 0; i2 < lines[i1].size(); ++i2){                 std::cout<<"["<<i1<<","<<i2<<"] = "<<lines[i1][i2]<<std::endl;             }         }     }else{         std::cerr<<"failed open file: "<<file_name<<std::endl;         return 1;     }     return 0; } the input file used has data:
450 105 10 10.5 -10.56001 23 10 478 1290 384 1289 3489234 1 2 3 4 5 1 2 3 4 5 6.1 19 -1.5 and output gives:
[0,0] = 450 [0,1] = 105 [0,2] = 10 [0,3] = 10.5 [0,4] = -10.56001 [1,0] = 10 [1,1] = 478 [1,2] = 1290 [1,3] = 384 [1,4] = 1289 [1,5] = 3489234 [1,6] = 1 [1,7] = 2 [1,8] = 3 [1,9] = 4 [2,0] = 1 [2,1] = 2 [2,2] = 3 [2,3] = 4 [2,4] = 5 [2,5] = 6.1 [2,6] = 19 now need use favorite parsing algorithm change each string double. (strtod, atof, etc) depending how important optimization may want modify container vector, depending upon use cases.
Comments
Post a Comment