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

时间:2013-11-13 21:36:30

标签: c++ linked-list text-parsing

我有一个NFL球队的文本文件。在解析字符串时,我遇到了一个问题,当涉及到有两个名字而不是一个名字的团队时。 (即新英格兰和匹兹堡)文件中的下一个项目是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语句来检查下一个char是否是char?然后,如果它是一个字符,它可以保存下一个单词,“英格兰”代表同名字段中新英格兰名字的后半部分,如果它是一个整数,它将转移到胜利字段。

txt file 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 = " ";
}

1 个答案:

答案 0 :(得分: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;
}

错误报告已被遗漏以保持示例简洁。我希望这会有所帮助。