2

我有一个打开的文本文件,光标在某个位置。我需要找到光标的行号。从性能的角度来看,以下哪种方法最好?

1) 将当前位置存储在变量 'pos' 中,并搜索从文件开头到 'pos' 的所有 '\n' 字符。

ifstream in("file.txt");
// move anywhere in the file
int lineNum = 0;
std::string line;
istream::pos_type pos = in.tellg();
in.seekg(0);
while ( std::getline(in, line) ) {
   ++lineNum;
   if(in.tellg() >= pos) break;
}

2) 使用单独的 ifstream 做同样的事情。

3)还有什么?

4

2 回答 2

1

从性能的角度来看,最好不要使用流,而是简单地将整个文件从开始到当前位置读取到一个大字符串(使用例如 fread),并从内存中的结果字符串中计算换行符分隔符的出现次数.

于 2013-04-08T12:37:23.250 回答
0

API 是一个很好的帮助点

来自:http ://www.cplusplus.com/reference/istream/istream/getline/

istream& getline (char* s, streamsize n ); 
istream& getline (char* s, streamsize n, char delim );

Get line 从流中提取字符作为未格式化的输入,并将它们作为 c 字符串存储到 s 中,直到提取的字符是定界字符,或者 n 个字符已写入 s(包括终止的空字符)。

定界字符是第一种形式的换行符('\n'),第二种形式的定界符:当在输入序列中找到时,从输入序列中提取,但丢弃而不写入 s。

因此,最好的方法是简单地使用 while 循环进行迭代并增加您的计数器。您不需要搜索换行符,因为该函数会为您完成。

于 2013-04-08T12:26:15.793 回答