我有一个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;
}
为了保持示例简洁,省略了错误报告。我希望这有所帮助。