我有 3 个使用 getline 的函数。第一个函数根据一行的第一个字符检查调用 2 个函数中的哪一个。
iMessage* getMessage(std::ifstream& ifs, char n) {
iMessage* msg;
std::string line;
std::getline(ifs, line, n);
if (line[0] == 'T') {
msg = new Twitter(ifs, n);
}
else if (line[0] == 'e') {
msg = new eMail(ifs, n);
}
else msg = nullptr;
return msg;
}
在推特/电子邮件构造器中:
eMail::eMail(std::ifstream& ifs, char n) {
std::string a;
std::getline(ifs, a, n);
//do stuff
}
Twitter::Twitter(std::ifstream& ifs, char n) {
std::string a;
std::getline(ifs, a, n);
//do stuff
}
问题是构造函数总是读取文件的第一行。我如何才能使构造函数读取与 getMessage() 函数相同的行?
最佳答案
getMessage
不需要阅读整行来完成它的工作。它可以只查看第一个字符。
事实上,有一个函数可以查看第一个字符而不将其从流中删除: peek()
.
所以整个事情就这么简单
iMessage* getMessage(std::ifstream& ifs, char n)
{
switch (ifs.peek())
{
case 'T': return new Twitter(ifs, n);
case 'e': return new eMail(ifs, n);
default: return nullptr;
}
}
但返回类型应该是std::unique_ptr<iMessage>
. std::unique_ptr
对于防止内存泄漏非常有帮助。
关于c++ - 使 getline() 读取正确的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26520509/