在C ++中的一行之后读取行不起作用

时间:2013-06-29 17:53:49

标签: c++ algorithm

我花了2个小时试图解析文件中的以下字节:

>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);
            }

        }

    }

我正在尝试解决问题的方法,这真让我头疼。

我也在寻找更好的方法。

2 个答案:

答案 0 :(得分: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检查的else中的空格的字符串并跳过它。

答案 1 :(得分:-1)

已编辑我已更正了我的答案并对其进行了测试。所以请不要再投票了!

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;
}