让getline()读取正确的行

时间:2014-10-23 02:48:58

标签: c++ file-io

我有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::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()函数相同的行?

2 个答案:

答案 0 :(得分:2)

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对于防止内存泄漏非常有用。

答案 1 :(得分:0)

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

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