阅读代码算法最后一行的问题-c ++

问题描述 投票:0回答:2

我在Stackoverflow上找到了此代码:

    if (file.is_open())
    {
        file.seekg(-1, std::ios_base::end);
        if (file.peek() == '\n')
        {
            //Start searching for \n occurrences
            file.seekg(-1, std::ios_base::cur);
            int i = file.tellg();
            for (i;i > 0; i--)
            {
                if (file.peek() == '\n')
                {
                    //Found
                    file.get();
                    break;
                }
                //Move one character back
                file.seekg(i, std::ios_base::beg);
            }
                string line;
                getline(file,line);
        }

它将文件的最后一行保存在变量'line'中,并且工作正常,但是如果最后一行是第一行,则它不会读取line的第一个字符(其余的将被读取)。当最后一行是例如第三行时,一切正常。有什么问题吗?

c++ file fstream
2个回答
0
投票

问题是您的所有代码仅在最后一个字符为'\n'时运行。

如果不是那样,则您的程序什么也不做。

您需要重新考虑if (file.peek() == '\n')部分。


0
投票

这里介绍一些解决方案。它使用另一种方法,要求将整个文件读入字符串。但这似乎可以解决您的问题。

std::string get_last_line(const std::string& s_file_name)
{
    std::ifstream file(s_file_name);

    std::string str((std::istreambuf_iterator<char>(file)),
                     std::istreambuf_iterator<char>());

    std::size_t p = str.find_last_of("\n");

    if (p == std::string::npos)
        return str;
    else
        return str.substr(p+1, str.length() - p);

    return std::string();
}
© www.soinside.com 2019 - 2024. All rights reserved.