2013-06-29 30 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; 
    } 
} 

它首先讀取輸入文件中的一行,並試圖解析它作爲一個ID。如果失敗,它會返回一個錯誤。然後它讀取數據直到找到另一個ID或EOF。它插入數據並繼續解析它發現的ID,如果它沒有遇到EOF。 工作演示:http://ideone.com/F4mcrc

注意:當文件爲空時,您可能需要檢查空白字符串或在ID檢查的其他位置僅包含空白字符的字符串,並跳過它。

-1

EDITED我已更正了我的答案並對其進行了測試。所以請不要再downvote!

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

@Mahmoud編輯。沒有測試,但你可以看到這裏的邏輯。 – Immueggpain

+0

這段代碼有一些問題:無限循環,未聲明的變量,你不應該在讀取行測試eof,而來自OP的while(std :: getline(infile,line))'是正確的方法。 –