我有一个显示以下内容的文本文件:
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();
答案 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
。