21xrx.com
2024-12-23 00:35:49 Monday
登录
文章检索 我的文章 写文章
C++如何读取文件的最后一行?
2023-07-01 16:54:08 深夜i     --     --
C++ 读取 文件 最后一行

在C++中,我们经常需要读取文件的最后一行,这可以通过以下几种方式来实现。

第一种方法是使用文件指针来遍历文件,直到最后一行。这种方法需要借助fseek函数,每次移动到下一行开始的位置,直到找到最后一行。

第二种方法是直接将文件读入std::vector中,然后反转vector并找到第一个换行符。这种方法需要读取整个文件,因此对于大文件可能会占用大量内存。

第三种方法是使用filebuf和istream。我们可以使用filebuf来获取文件大小,并将文件指针移动到倒数第二行的末尾。然后,我们可以使用istream中的getline函数读取最后一行。

无论使用哪种方法,读取文件的最后一行都需要注意处理文件结尾不带换行符的情况。

以下是使用filebuf和istream读取最后一行的示例代码:


#include <fstream>

#include <iostream>

#include <string>

std::string getLastLine(const std::string& filename) {

  std::ifstream file(filename);

  if (!file) {

    throw std::runtime_error("Unable to open file");

  }

  std::filebuf* pbuf = file.rdbuf();

  // Get file size

  std::size_t fileSize = pbuf->pubseekoff(0, file.end);

  pbuf->pubseekpos(fileSize - 1);

  // Skip any end-of-file characters

  char c = pbuf->sgetc();

  while (c == '\n' || c == '\r') {

    pbuf->pubseekoff(-2, std::ios_base::cur);

    c = pbuf->sgetc();

  }

  // Move to the beginning of the line

  std::size_t lineStart = pbuf->pubseekoff(-1, std::ios_base::cur);

  while (lineStart > 0 && pbuf->sgetc() != '\n') {

    --lineStart;

    pbuf->pubseekoff(-2, std::ios_base::cur);

  }

  if (lineStart == 0) {

    pbuf->pubseekoff(0, std::ios_base::beg);

  } else {

    pbuf->pubseekoff(1, std::ios_base::cur);

  }

  // Read the line

  std::string line;

  std::getline(file, line);

  return line;

}

int main() {

  std::string filename = "test.txt";

  std::string lastLine = getLastLine(filename);

  std::cout << "Last line: " << lastLine << std::endl;

  return 0;

}

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复