【问题标题】:How to count line numbers in a file?如何计算文件中的行号?
【发布时间】:2013-04-08 12:15:04
【问题描述】:

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

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) 还有什么吗?

【问题讨论】:

  • 您如何进入当前位置?始终简单地跟踪光标所在的行可能是最有效的方法。
  • std::getline(in, std::string())
  • 我很惊讶这个编译。据我所知,istream::pos_type 不应该支持>=。 (在 Unix 和 Windows 下,您可能可以通过将两者都转换为 streamoff 来获得相同的效果。不过,我认为这不能保证真正可移植。)
  • @BenjaminLindley:已修复;谢谢!

标签: c++ position ifstream line-numbers


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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'),第二种是delim:当在输入序列中找到时,从输入序列中提取,但丢弃而不写入s。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-28
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多