2017-03-28 8 views
0

이제 2 번 줄을 보면, Cow-DNA Sequence; 이것은 13 행과 24 행에서 계속됩니다. 그리고 ... 사이에 공백과 새 줄을 무시한 각 시퀀스에 대해이 긴 시퀀스를 가져 오려고합니다. 1줄 바꿈없이 공백없이 나머지 시퀀스를 읽는 방법은 무엇입니까? C++

이는

ifstream file ("txt"); 
string line; 
vector <string> vec; 
stringstream s; 
string name; 

string strip(string & s) 
{ 
    size_t b = s.find_first_not_of(' '); 
    size_t e = s.find_last_not_of(' '); 
    if (b == string::npos) { 
     return ""; 
    } else { 
     return s.substr(b, e - b + 1); 
    } 
} 

void getSequence(){ 
    int i; 
    int row; 
    int col; 
    if (file.is_open()) 
    { 
     file >> row >> col; 
     for (i = 0; i < row; i++) { 
      vec.push_back(""); 
     } 
     i = 0; 
     while (getline(file, line)) 
     { 
      file >> name; 
      if (line == " ") 
      { 
       continue; 
      } 

      vec[i % row] += strip(line); 
      i++; 
     } 
    } 
    else { 
     cerr << "Error: file did not open!" << endl; 
    } 
    for (const string & v : vec) { 
     cout << v << endl; 
    } 
} 

당신의 도움에 미리 감사드립니다 처음 10 개 시퀀스를 읽는 코드입니다 :

는 파일의 형식입니다.

+1

루프 대신 'vector.resize (row)'를 사용할 수 있으며,'getline'은 전체 행을 읽습니다. 'file >> name;을 사용하여 그 뒤에 오는 것은 당신이 필요로하는 것이 아닙니다. 2-11 줄이 13+에 해당하는지 또는 해당 데이터로 무엇을하려하는지 명확하지 않습니다. –

+1

그리고 그것은 얼마나 많은 라인을 계속 사용합니까? 알아야 할 형식 정보가 충분하지 않습니다. –

+0

링크를 참조하십시오. 형식에 대한 더 나은 아이디어를 제공해야합니다. 그것이 내가 사용하고있는 파일이다. 'file >> name; '각 시퀀스의 이름을 저장합니다. – Shukri

답변

0

아마도 조금 도움이 될 것입니다. 아이디어는 & 행을 읽고 행 수에 대한 헤더 행을 읽는 것입니다. 그 후 반복적으로 라인의 다음 덩어리를 읽고 라인이 삽입 된 것으로 가정하여 각각을 올바른 항목에 추가합니다.

#include <iostream> 
#include <fstream> 
#include <string> 
#include <vector> 

struct Sequence 
{ 
    std::string name; 
    std::string data; 
}; 
using SeqVec = std::vector<Sequence>; 

bool readHeader(std::ifstream& f, SeqVec& v) 
{ 
    for (size_t i = 0; i < v.size(); ++i) 
    { 
     if (!(f >> v[i].name >> v[i].data)) 
     { 
      return false; 
     } 
    } 
    return true; 
} 

int readChunk(std::ifstream& f, SeqVec& v) 
{ 
    int linesRead = 0; 
    std::string chunk; 
    for (size_t i = 0; i < v.size(); ++i) 
    { 
     if(!(f >> chunk)) 
     { 
      break; 
     } 
     v[i].data += chunk; 
     ++linesRead; 
    } 
    return linesRead; 
} 

int main() 
{ 
    std::vector<Sequence> v; 

    const std::string filename = "test.txt"; 
    std::ifstream f(filename); 
    if (!f) 
    { 
     return -1; 
    } 

    int row; 
    int col; 
    if (f >> row >> col) 
    { 
     v.resize(row); 
     if (!readHeader(f, v)) 
     { 
      return -1; 
     } 
     for (;;) 
     { 
      int linesRead = readChunk(f, v); 
      if (linesRead == 0 && v[0].data.size() == col) 
      { 
       //If we read nothing and the lines are the correct length we're done. 
       break; 
      } 
      else if (linesRead < v.size()) 
      { 
       //partial read is an error. 
       return -1; 
      } 
     } 
    } 

    for (auto& seq : v) 
    { 
     std::cout << seq.name << " : " << seq.data << "\n"; 
    } 
    return 0; 
} 
+0

큰 도움이됩니다. 정말 고맙습니다. 'struct'에 대해 몰랐습니다! – Shukri

+0

그냥 작은 수정 : 대신 &&'(linesRead == 0 && v [0] .data.size() == col)', || 필요합니다. 그래서'if (linesRead == 0 || v [0] .data.size() == col)'. 다시 고마워요 – Shukri

+0

그게 당신을 위해, 괜찮아요,하지만 올바른 조건을하지 않습니다 열 개수가 파일에 대한 가정합니다. 항상 행 * 줄이 여러 개있을 것으로 예상됩니다. 행은 행 수만큼 덩어리로 읽히며 마지막에는 모든 행을 읽은 후 다음 읽기가 0 행이되고 데이터가 올바른 길이가 될 것으로 예상됩니다. 그런 일이 일어나지 않으면 파일의 열 수가 잘못되었거나 잘못된 것이 있습니다. –