我有一个文件,我只想将最后一行输出到控制台。
这是我对如何做到这一点的想法。使用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
的范围。举一个文本文件的例子,它看起来像这样:
垃圾
垃圾
跳过这一行
这是我们正在寻找的那条线!
答案 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--;
}