C++使用getline读取文件时满足条件如何保持文件指针位置不跳行
C++ 读取文件时保留当前行的实现方案
方案1:使用缓存变量存储已读取的行(推荐,性能更稳定)
不需要操作文件指针,避免IO操作出错,逻辑更简单:
- 额外定义一个字符串变量做行缓存,标记是否有未处理的遗留行
- 每次循环先判断有没有遗留行,有就直接用缓存内容,没有再调用
getline读新行 - 如果当前行满足不需要推进的条件,就把当前行内容存到缓存里,供下一次循环使用
代码示例:
#include <fstream> #include <string> #include <iostream> int main() { std::ifstream infile("你的文件路径.txt"); std::string line; std::string cached_line; bool has_cached = false; while (true) { // 优先用缓存的行 if (has_cached) { line = cached_line; has_cached = false; } else { if (!std::getline(infile, line)) { break; // 文件读完退出循环 } } // 这里替换为你自己的业务判断逻辑 bool 满足保留条件 = (stoi(line) % 100 == 0); // 仅为示例条件 if (满足保留条件) { // 把当前行存到缓存,下一次循环还会读到这一行 cached_line = line; has_cached = true; } // 你原本的业务处理逻辑写在这里 std::cout << "当前处理行: " << line << std::endl; } infile.close(); return 0; }
方案2:操作文件指针回退
如果不想加缓存变量,可以在读完行之后,用seekg把指针回退到当前行的起始位置,注意这种方式需要处理换行符的长度,不同系统换行符长度不同(Windows是\r\n2字节,Linux/macOS是\n1字节),更适合确定文件换行格式的场景:
代码示例:
#include <fstream> #include <string> #include <iostream> int main() { std::ifstream infile("你的文件路径.txt"); std::string line; std::streampos last_pos; // 存储读取前的指针位置 while (true) { last_pos = infile.tellg(); // 先记录读取前的指针位置 if (!std::getline(infile, line)) { break; } bool 满足保留条件 = (stoi(line) % 100 == 0); // 替换为你的实际条件 if (满足保留条件) { // 指针回退到读这一行之前的位置,下次getline还是读这行 infile.seekg(last_pos); } // 你原本的业务处理逻辑 std::cout << "当前处理行: " << line << std::endl; } infile.close(); return 0; }
注意:如果文件是以二进制模式打开的,换行符不会被转义,回退逻辑更准确;如果是文本模式打开,跨系统使用时注意适配换行符长度。
内容的提问来源于stack exchange,提问作者Francisco Pinheiro
相关产品推荐
相关产品推荐

