解析文本文件时,同一字段具有 1 或 2 个名称



我有一个NFL球队的文本文件。当涉及到 2 个名字而不是一个名字的团队时,我在解析字符串时遇到了问题。(即新英格兰和匹兹堡)文件中的下一项是 int。我还必须将这些值读入链表。

infile     >> t.date // t is a team struct which contains char name and ints
           >> t.name 
           >> t.W
           >> t.L
           >> t.T

我可以在名称和 Wins 之间使用 if else 语句来检查下一个字符是否是字符吗?然后,如果它是一个字符,它可以在同一名称字段中保存下一个单词"英格兰"作为新英格兰名称的后半部分,如果它是一个整数,它将移动到Wins字段。

TXT 文件 ex

新英格兰 2 4 0
匹兹堡 1 6 0

上面的代码是我试图用来将名称分配给团队结构的代码

   struct team
{
public:
    team& do_input(std::istream& is);
    std::string date, name, name2;
    int wins, 
        losses, 
        ties;
    std::string perc,
        home, 
        road,
        div,
        conf;
     int league;
};
   infile >>t.date;
   while (infile >> t)
    {
        t.do_input(infile) ;
        //cout << t.date << t.name;
        L.push_back(t);
        t.name2 = " ";
}

让我们从维护代码开始。我要做的第一件事是创建一个operator >>重载,它接受输入流和team对象。

std::istream& operator >>(std::istream& is, team& t);

此函数应将提取输入的操作委托给名为 do_input() 的方法:

std::istream& operator >>(std::istream& is, team& t)
{
    if (is.good())
        t.do_input(is);
    return is;
}

do_input应将 char 类型的对象读入 team 类中的相应字符串对象。 说到team类,最好使用 std::string 来表示字符串值:

struct team
{
    ...
    std::string date;
    std::string name;
    int W, L, T;
};

这样,字符串就可以根据需要足够大。我们不再需要担心潜在的缓冲区溢出(即读取大于 10 个字节的字符串)。我们还可以使用std::string提供的便捷方法。

进一步建议你使用好的变量名,以便代码的维护者可以一目了然地知道它的含义。例如,尝试以下:

int wins, losses, ties;

现在我(和其他人)很清楚这些名字意味着什么。


因此team::do_input是一个成员函数,它将字符串和整数从文件中读取到从中调用它的实例的数据成员。下面是一个完整的实现:

struct team
{
public:
    team& do_input(std::istream&);
private:
    std::string date, name;
    int wins, losses, ties;
};
team& team::do_input(std::istream& is)
{
    std::getline((is >> date).ignore(), name);
    is >> wins >> losses >> ties;
    return *this;
}
为了

保持示例简洁,省略了错误报告。我希望这有所帮助。

相关内容

  • 没有找到相关文章

最新更新