从文本中读取多行并将其作为对象存储在矢量中

时间:2018-04-11 09:31:50

标签: c++ c++11 visual-c++ c++14

大家晚上好,

我正在尝试使用以下格式从文本文件源中读取:

   doomsday [villain]
   Doomsday is a fictional supervillain appearing in American comic books published by DC Comics.

   superman [hero]
   Superman is a fictional superhero appearing in American comic books published by DC Comics.

这是两个条目。我需要提取名称,角色和描述,以便将其放入一个对象,例如。

   DCCharacters newCharacter(characterName, characterRole, description);

到目前为止我的代码:

ifstream fileToOpen(fileSrc);

if (fileToOpen.is_open()) {
    string line;
    string charName;
    string charRole;
    string charDesc;

    while (!fileToOpen.eof()) {

        getline(fileToOpen, line);
        charName = line;
        if (line == "") continue; // Skip blank lines

        getline(fileToOpen, line);
        charDescription = line;
        if (line == "") continue;

        DCCharacters newCharacter(characterName, characterRole, description);
        this->DCCharsVector.push_back(newCharacter);
    }
    // Close the file
     fileToOpen.close();
     }
 }

正如你所看到的,我可以在一行中提取字符名称和角色,在另一行中提取描述,但我现在不知道如何将名称和角色分成两个单独的变量,以便将它们放入对象中,就像我需要的那样。

我期待着任何帮助。

1 个答案:

答案 0 :(得分:0)

std::getline()还有一个重载,可以解决您的问题:

istream& getline (istream&  is, string& str, char delim);

如果您使用' ' (空格字符)作为分隔符,std::getline()将只读取它看到的第一个空格。

因此,您的代码可能如下所示:

if (fileToOpen.is_open()) 
{
    string line;
    string charName;
    string charRole;
    string charDesc;

    while (!fileToOpen.eof()) 
    {
        getline(fileToOpen, line, ' ');
        charName = line;
        if (line == "") continue; // Skip blank lines

        getline(fileToOpen, line);
        charRole = line; //possibly strip off '[]' before assigning
        if (line == "") continue; // Skip blank lines

        getline(fileToOpen, line);
        charDescription = line;
        if (line == "") continue;

        DCCharacters newCharacter(characterName, characterRole, description);
        DCCharsVector.push_back(newCharacter);
    }
// Close the file
    fileToOpen.close();
}

在旁注中,你不必要地多次复制字符串。您可以将charName等作为参数传递给std::getline()并删除line变量 此外,由于您标记了C++11,因此您可以使用

DCCharsVector.emplace_back(characterName, characterRole, description) 

避免创建临时对象。