【问题标题】:Read multiple lines fro text and store in a vector as objects从文本中读取多行并作为对象存储在向量中
【发布时间】:2018-09-21 03:02:10
【问题描述】:

大家晚上好,

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

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

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

我期待任何帮助。

【问题讨论】:

  • 在使用line的内容之前,你应该检查getline()的返回码。您应该考虑为您的班级实现operator>>() 重载...

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


【解决方案1】:

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) 

避免创建临时对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2014-04-18
    • 1970-01-01
    相关资源
    最近更新 更多