使getline()读取右侧行

Make getline() read the right line

本文关键字:读取 getline      更新时间:2023-10-16

我有3个使用getline的函数。第一个函数根据行的第一个字符检查要调用两个函数中的哪一个。

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;
}

在twitter/电子邮件构造函数中:

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;
    }
}

但是返回类型应该是CCD_ 3。std::unique_ptr对防止内存泄漏非常有帮助。

getMessage中,您可以在读取以下行后恢复文件位置:

std::streampos pos = ifs.tellg();
std::getline(ifs, line, n);
ifs.seekg(pos);