c++ - 使 getline() 读取正确的行

标签 c++ file-io

我有 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/

相关文章:

c++ - 整数如何存储在内存中?

c++ - 从内存中的某个位置加载 DLL

file-io - 如何从文件创建延迟计算范围?

C -- 文件输入读取问题

c++ - Boost.Locale 是否支持读写 UTF-8 编码的文件?

C++ 判断一个容器是否有::find()

c++ - 我正在尝试计算 char 数组中的内容直到空终止,但每次编译时我得到的数字都大于我的数组

python - numpy.savetxt 的分隔符

c# - 使用 C# 访问网络文件共享

regex - 将输出打印到 perl 中的文件