我在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的第一个字符(其余的将被读取)。当最后一行是例如第三行时,一切正常。有什么问题吗?
问题是您的所有代码仅在最后一个字符为'\n'
时运行。
如果不是那样,则您的程序什么也不做。
您需要重新考虑if (file.peek() == '\n')
部分。
这里介绍一些解决方案。它使用另一种方法,要求将整个文件读入字符串。但这似乎可以解决您的问题。
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();
}