我有一个打开的文本文件,光标位于某个位置。我需要找到光标的行号。在绩效观点下,以下哪种方法最佳?
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)还有别的吗?
答案 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循环进行迭代并增加计数器。您不需要搜索换行符,因为该函数会为您执行此操作。