C++读取文件最后十行:seekg使用疑问及指定行跳转方法咨询
读取文本文件最后十行的问题与解决方案
你猜的完全没错!seekg在文本模式下的定位逻辑和二进制模式差异很大,根本没法像你那样直接用字节偏移来定位到倒数第十行。文本模式里,换行符的字节数是平台相关的(比如Windows是\r\n占2字节,Linux/macOS是\n占1字节),而且标准C++并没有保证文本模式下seekg能精准按字节偏移工作,你写的seekg(10L, ios::end)大概率会落在某一行的中间,读出来的内容自然是乱的。
先说说你考虑的「统计总行数再跳过前N行」的方案:其实它真的没你想的那么繁琐——你自己也发现了,只需要新增6行左右的代码就能搞定,而且这是文本文件场景下最可靠的方法之一。毕竟文本文件的行长度不固定,系统没法直接算出第N行的起始位置,必须逐行计数才行。
至于你问的「有没有类似seekg直接跳转到指定行的方法」:很遗憾,标准C++库并没有提供这种功能。因为文本文件的行没有固定的长度和偏移信息,想要定位到指定行,必须先逐行读取计数,没有捷径可走。
如果你的文件特别大,统计总行数的方法效率有点低,倒是可以试试从文件末尾反向读取的思路:以二进制模式打开文件,从末尾开始逐个字节往前找换行符,找到第10个换行符后,再从那个位置开始正向读取剩下的内容。不过这种方法需要处理不同平台的换行符,还要注意文件编码问题,实现起来反而比计数方案复杂,普通大小的文件完全没必要折腾。
附上你原来的代码(方便大家参考问题场景):
//Set cursor to 10 places before end //Read lines of input input.seekg(10L, ios::end); getline(input, a); while (input) { cout << a << endl; getline(input, a); } input.close(); int b; cin >> b; return 0; }
内容的提问来源于stack exchange,提问作者Louis Pelletier
相关产品推荐
相关产品推荐

