2013-06-29 2 views
-2

я провел как 2 часа, пытаясь разобрать следующие байты из файла:Чтение линии после того, как линия C не ++ работает

>Rosalind_6404 
CCTGCGGAAGATCGGCACTAGAATAGCCAGAACCGTTTCTCTGAGGCTTCCGGCCTTCCC 
TCCCACTAATAATTCTGAGG 
>Rosalind_5959 
CCATCGGTAGCGCATCCTTAGTCCAATTAAGTCCCTATCCAGGCGCTCCGCCGAAGGTCT 
ATATCCATTTGTCAGCAGACACGC 
>Rosalind_0808 
CCACCCTCGTGGTATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCCGGAC 
TGGGAACCTGCGGGCAGTAGGTGGAAT 

Я хотел бы сохранить слово Rosalind_ и хранить каждую строку, конкатенировать все и иметь только одну строку со всеми строками.

Я пробовал следующий код, но он все еще не работает, возможно, я всегда пропускаю последнюю строку.

int main() 
{ 
    std::ifstream infile("data_set.txt"); 
    map < int, string > ID; 
    map < int, string > dataSetMap; 
    int idNumber= 0; 
    int idDataSetNumber = 0; 

    std::string line; 
    std::vector<string> dataSetString; 
    std::string seqid; 

    while (!infile.eof()) 
    { 

     while(std::getline(infile, line)) 
     { 

      if (line.substr(0,1)== ">") 
      { 

       conct = ""; 
       seqid = line.substr(1,line.length() - 1); 
       ID.insert(make_pair(idNumber++, seqid)); 
       lineNumber = 0; 
       line.clear(); 
       std::string data= ""; 
       if(dataSetString.size()>0) 
       { 
        for (int i = 0; i<dataSetString.size(); i++) 
        { 
         data+=dataSetString[i]; 
        } 
        dataSetMap.insert(make_pair(idDataSetNumber++, data)); 
       } 
       dataSetString.clear(); 
      } 

      if(!line.empty()) 
      { 

       dataSetString.push_back(line); 
      } 

     } 

    } 

Я пытаюсь практиковать решения для решения проблем, и это действительно дало мне головную боль.

Я также ищу лучший подход.

+0

Используйте отладчик, чтобы выполнить свой код, он легко выявит проблемы, подобные этим, и это облегчит эту головную боль .. обещание;) –

+5

Чтобы получить эффективную помощь здесь, вам нужно показать результат, который вы получите, и описать, как он отличается от того, что вы ожидали. – kfsone

ответ

0

Этот код делает то, что вы хотите:

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

int main() 
{ 
    std::istream& infile = std::cin; 
    std::map < int, std::string > ID; 
    std::map < int, std::string > dataSetMap; 
    int idNumber= 0; 
    int idDataSetNumber = 0; 

    std::string line; 
    std::vector<std::string> dataSetString; 
    std::string seqid; 

    bool success = std::getline(infile, line); 
    while(success) { 
     if(line.substr(0,1) == ">") { 
      seqid = line.substr(1,line.length() - 1); 
      ID.insert(make_pair(idNumber++, seqid)); 
      std::string data; 
      while(success = std::getline(infile, line)) { 
       if(line.substr(0,1) == ">") break; 
       data += line; 
      } 
      dataSetMap.insert(make_pair(idDataSetNumber++, data)); 
     } else { 
      std::cout << "Invalid input file. It needs to start with >SOME_ID" << std::endl; 
      return 1; 
     } 
    } 

    std::cout << "Parsed data ----------------" << std::endl; 
    for(std::map<int,std::string>::const_iterator it = dataSetMap.begin(); it != dataSetMap.end(); ++it) { 
     std::cout << "Id: " << ID[it->first] << std::endl; 
     std::cout << (it->second) << std::endl; 
    } 
} 

сначала читает строку из входного файла и пытается разобрать его в качестве идентификатора. Если это не удается, оно возвращает ошибку. Затем он считывает данные, пока не найдет другой идентификатор или EOF. Он вставляет данные и продолжает анализировать найденный идентификатор, если он не встретил EOF. Рабочая демо: http://ideone.com/F4mcrc

Примечание: Это не удается, когда файл пуст, вы можете проверить пустую строку или строку, содержащую только пробельные в ELSE чека ID и пропустить его.

-1

EDITED Я исправил свой ответ и протестировал его. Так что не более вниз вниз, пожалуйста!

int main() 
{ 
    using namespace std; 
    ifstream infile("data_set.txt"); 
    map < int, string > ID; 
    map < int, string > dataSetMap; 
    int idNumber= 0; 
    int idDataSetNumber = 0; 

    string line; 
    vector<string> dataSetString; 
    string seqid; 

    while (true) 
    { 
     bool b=infile.eof(); 
     if(!b) 
      std::getline(infile, line); 
     if (line.substr(0,1)== ">" || b) 
     { 
      if(!b) 
      { 
       seqid = line.substr(1,line.length() - 1); 
       ID.insert(make_pair(idNumber++, seqid)); 
      } 
      line.clear(); 
      string data= ""; 
      if(dataSetString.size()>0) 
      { 
       for (unsigned int i = 0; i<dataSetString.size(); i++) 
       { 
        data+=dataSetString[i]; 
       } 
       dataSetMap.insert(make_pair(idDataSetNumber++, data)); 
      } 
      dataSetString.clear(); 
      if(b) 
       break; 
     } 

     if(!line.empty()) 
     { 
      dataSetString.push_back(line); 
     } 

    } 

    return 0; 
} 
+0

Я думал об этом раньше, но вы думаете о лучшем решении?! Я думаю, что это слишком много кода для этой простой задачи? – Andre

+0

@ Махмуд Отредактировано. Не проверено, но вы можете увидеть здесь логику. – Immueggpain

+0

У этого кода есть некоторые проблемы: бесконечный цикл, необъявленные переменные, и вы не должны тестировать eof при чтении строк, 'while (std :: getline (infile, line))' из OP - это правильный способ сделать это. –

Смежные вопросы