0

我有一个 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 语句来检查下一个字符是否是字符吗?然后,如果它是一个字符,它可以在同名字段中保存下一个单词“England”,作为新英格兰名字的后半部分,如果它是一个 int,它将转到 Wins 字段。

txt 文件前

新英格兰 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 = " ";
}
4

1 回答 1

0

让我们从维护您的代码开始。我要做的第一件事是创建一个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;
}

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

于 2013-11-14T00:14:24.927 回答