我有一个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 = " ";
}
答案 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;
}
错误报告已被遗漏以保持示例简洁。我希望这会有所帮助。