C ++中的Getline问题

时间:2014-05-15 12:45:45

标签: c++ getline

我有一个显示以下内容的文本文件:

John    Smith    21    UK
David   Jones    28    FRANCE
Peter   Coleman  18    UK

我试图将每个单独的元素剥离成一个向量数组。我尝试使用带有制表符分隔符的getline函数,但它存储了每个元素。例如:

getline (f, line, '\t');
records.push_back(line);

我如何逐行分开?想法是执行搜索并输出相应的行。例如,搜索琼斯将打印出第二行。

这是我到目前为止所得到的,但正如你所看到的,它没有给我预期的结果:

string sString;
string line;
string tempLine;
string str;
vector<string> records;

cout << "Enter search value: " << endl;
cin >> sString;

cout << "\nSEARCHING\n\n";
ifstream f("dataFile.txt");

while (f)
    {
    while(getline (f, tempLine))
    {
       getline (f, line, '\t');
       records.push_back(line);
    }
    for(int i=0; i < records.size(); i++)
    {
       if(sString == records[i]) {
        cout << "RECORD FOUND" << endl;
        for(int j=0; j < records.size(); j++)
        {
            cout << j;
            cout << records[j] << "\t";
        }
        }
    }

}
f.close();

2 个答案:

答案 0 :(得分:1)

第一个getline从输入中提取完整的一行。 第二行从下一行中提取一个字段。如果你想 要恢复分解为字段的行,你应该这样做:

std::vector<std::vector<std::string>> records;
std::string line;
while ( std::getline( f, line ) ) {
    records.push_back( std::vector<std::string>() );
    std::istringsream fieldParser( line );
    std::string field;
    while ( std::getline( fieldParser, field ) ) {
        records.back().push_back( field );
    }
}

这将产生记录向量,其中每条记录都是 矢量的字段。通常,您会想要使用结构 对于记录,并在该行上进行更多解析,例如:

struct Field
{
    std::string firstName;
    std::string lastName;
    int age;
    std::string country;
};
std::vector<Field> records;
std::string line;
while ( std::getline( f, line ) ) {
    std::istringsream fieldParser( line );
    Field field;
    fieldParser >> field.firstName >> field.lastName >> field.age >> field.country >> std::skipws;
    if ( !fieldParser || fieldParser.get() != EOF ) {
        //  Error occurred...
    } else {
        records.push_back( field );
    }
}

(这个简单的东西只有在没有字段的情况下才会起作用 包含空白区域。但扩展起来很简单。)

答案 1 :(得分:0)

你正在getline进入tempLine吃掉一整行,然后你在循环中做了一个不同的getline。这是它无法运作的重要原因 - 你只是扔掉了包含大量数据的tempLine