【发布时间】:2011-07-09 14:48:33
【问题描述】:
如果我使用 fstream 打开一个文本文件,是否有一种简单的方法可以跳转到特定的行,例如第 8 行?
【问题讨论】:
-
是的,如果所有行的长度完全相同。
-
是的,阅读 7 行。不,如果行不是以字节为单位的固定长度,则不能跳转。
如果我使用 fstream 打开一个文本文件,是否有一种简单的方法可以跳转到特定的行,例如第 8 行?
【问题讨论】:
绕到那里。
#include <fstream>
#include <limits>
std::fstream& GotoLine(std::fstream& file, unsigned int num){
file.seekg(std::ios::beg);
for(int i=0; i < num - 1; ++i){
file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
}
return file;
}
将file 的查找指针设置为num 行的开头。
测试具有以下内容的文件:
1
2
3
4
5
6
7
8
9
10
测试程序:
int main(){
using namespace std;
fstream file("bla.txt");
GotoLine(file, 8);
string line8;
file >> line8;
cout << line8;
cin.get();
return 0;
}
输出:8
【讨论】:
如果每一行的长度相同,那么您可以使用 istream::seekg() 跳转到该位置并从那里读取。
【讨论】:
如果行的长度相同,这是一个使用std::getline() 的工作且简洁的示例:
#include <iostream>
#include <fstream>
#include <string>
const int LINE = 4;
int main() {
std::ifstream f("FILE.txt");
std::string s;
for (int i = 1; i <= LINE; i++)
std::getline(f, s);
std::cout << s;
return 0;
}
【讨论】:
LENGTH 留在那里。 2.getline(src, str)这里有点太浪费了,我觉得。
getline 的替代方法。它可能不是性能最好的。
LENGTH 不是一个约束。您那里的代码不需要 需要知道行的长度(不需要“具有相同的长度”)。现在添加它可能不是一个好主意,虽然^^'
一般来说,不,你必须使用类似于Xeo shows的策略走下去。
如果netrom says 你知道行有固定长度,是的。
即使事先不知道行长,但 (1) 你会想要跳来跳去, (2) 你可以保证同时没有人在弄乱你的文件可以通过一次来形成一个索引,然后再使用它。
【讨论】: