如何计算文件中的行号?

时间:2013-04-08 12:15:04

标签: c++ position ifstream line-numbers

我有一个打开的文本文件,光标位于某个位置。我需要找到光标的行号。在绩效观点下,以下哪种方法最佳?

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)还有别的吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

API是一个很好的帮助地点

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

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

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

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

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