使用seekg()c ++从文件末尾搜索char

时间:2016-05-18 01:02:09

标签: c++ file seekg

我有一个文件,我只想将最后一行输出到控制台。

这是我对如何做到这一点的想法。使用int decrement = -1;将自己置于文件末尾。

然后,我可以创建一个减量变量 while (joke.peek() != '\n') { decrement--; } 并使用while循环

joke.seekg(decrement, ios::end);

并获得我最后一行的起始位置(从结尾开始向后)。

知道了这一点,string input;应该把我设置到最后一行的开头,并假设我之前声明 getline(joke, input); cout << input << endl;  我想是

 void displayLastLine(ifstream &joke)
 {
    string input;
    int decrement = -1;


    joke.clear();
    joke.seekg(0, ios::end);


    while (joke.peek() != '\n')
    {
        decrement--;

    }
    joke.clear();

    joke.seekg(decrement, ios::end);

    getline(joke, input);
    cout << input << endl;

}

会将其输出到控制台。

完整代码

'\n'

问题是,当我为文件调用此方法时,没有任何反应。当我逐步完成它时,减量只会减去一个,远远超出.inserted_primary_key的范围。举一个文本文件的例子,它看起来像这样:

垃圾

垃圾

跳过这一行

这是我们正在寻找的那条线!

3 个答案:

答案 0 :(得分:1)

peek不会移动文件指针,它会在不提取字符的情况下读取字符。所以,你经常偷看相同的值(字符)并以无限循环结束。

你需要做的是:

while (joke.peek() != '\n')
{
    joke.seek(-1, ios::cur);
}

这将使用seekg的第二次重载将输入位置置于\n

请注意,这不是一个完美的解决方案。您需要检查错误和边界条件,但它会解释您观察到的行为,并为您提供一些开始修复代码的方法。

答案 1 :(得分:1)

joke.seekg(0, ios::end);

这会将文件定位在最后。

while (joke.peek() != '\n')

嗯,这是问题#1。当您在文件末尾时,peek()始终返回EOF

    decrement--;

你写道:

  

当我单步执行时,减量只会继续减去一个,

嗯,你期望发生什么,因为这是循环唯一的作用? for循环唯一做的就是从decrement中减去1。这就是发生的事情。

这是一个常见的问题:计算机只会执行您要求它执行的操作,而不是您希望它执行的操作。

虽然这不是最佳选择,但您缺少的步骤是在peek()之前,您需要seek()返回一个字符。然后,peek()显示当前光标位置的字符。然后,seek()返回一个字符,再次检查peek(),依此类推。

但这对你来说仍然不够。大多数文本文件以换行符结尾。也就是说,换行符是文件中的最后一个字符。因此,即使你添加了丢失的seek(),几乎在所有情况下,你的代码最终会做的是找到文件中的最后一个字符,即最后的换行符。

我的建议是暂时停止编写代码,然后提出一个逻辑过程来执行您想要执行的操作,并用简单的单词描述此过程。然后,discuss your proposed course of action with your rubber duck。只有在您的橡皮鸭同意您的建议将起作用后,才能将您的简明语言描述翻译成代码。

答案 2 :(得分:0)

你的循环实际上只是减少&#34;减少&#34;而不是用它来进行下一次搜索。

while (joke.peek() != '\n')

{
    joke.seekg(decrement, std::ios::end);
    decrement--;
}