在C中计数文件行#

问题描述:

我想知道我的文件中有多少行。我怎样才能以简单的方式做到这一点(我的意思是,不要遍历整个文件并计算每一行)?有没有一个命令?在C中计数文件行#

+0

遍布整个文件?我们正在谈论3行代码来计算这一点。 – 2010-01-20 16:29:31

好:

int lines = File.ReadAllLines(path).Length; 

是相当简单的,但对于庞大的文本文件不是很有效。我可能会在大多数情况下使用TextReader,以避免过多的缓冲:

int lines = 0; 
using (TextReader reader = File.OpenText(path)) { 
    while (reader.ReadLine() != null) { lines++; } 
} 
+0

坦克!!!! 顺便说一句,我用这个为65500行的文件,所以我认为它甚至错误的文件... – aharon 2010-01-20 16:42:36

任何“功能”你打电话是要基本上做同样的事情 - 通过走行线和计数新行的数量字符。

如果你想让自己陷入让更多的东西看起来更“脆”的情况,那么用一个正则表达式来计算新行字符的数量就可以实现。

+0

一旦你已经读完整个文件 - 如果它很大,不是真的可行。或者你每行都这样做......哦,等等......-) – 2010-01-20 16:29:33

+0

我们应该告诉OP,它仍然会读取整个文件吗? ;) 我想,如果元数据附加到追踪行数的文件(它可能只适用于文本文件),那么你可以阅读它。但我不认为存在这样的事情。 – FrustratedWithFormsDesigner 2010-01-20 16:34:08

这样或那样的(正则表达式,FileStream等)的东西,某处将不得不通过换行符。

取决于线路的长度...通常最快的方法就是做这个用这个简单的公式 - 获得以字节为单位的文件长度和线的长度划分,例如:

 
const int LINE_LENGTH = 80; 
System.IO.FileInfo f = new System.IO.FileInfo(path); 
int noLines = f.Length/LINE_LENGTH; 

上面假定线的长度是恒定的80个字符宽...

如果长度是可变的,存在从通过每个线打开该文件并重复这样做,除了没有其它方式并跟踪行数。

编辑: 我才意识到一个更简单的方法后,我贴在下面留言.. 这岂不是更容易实际使用的外壳下System.Diagnostics.Process命名空间使用的参数作为文件路径来调用grep -c "$(\r?\n?|\n)"问题 - 这将使它更加灵活,并可以满足任何文件。你必须做的输出被读取和正则表达式,它得到的线路的实际数量,例如,用我的grep与用Borland C来的唯一的事情,我得到这个输出

 
C:\Documents and Settings\Tom>grep -c "$(\r?\n?)" 273.txt 
File 273.txt: 
35 lines match 

输出和里程可能会有所不同,-c命令切换到grep意味着'计数'

+0

它采用ASCII或低端UTF8编码,加上它不考虑换行符本身的长度。 – 2010-01-20 16:37:55

+0

行长是可变的,然后长80字符.. 谢谢反正.. – aharon 2010-01-20 16:38:00

+0

嘿,谁打算实际打开一个+ 65K行文件,计数每一个,然后将其与此代码的结果进行比较?我说把它放在那里,如果有人提交错误报告,就更改它。 – Will 2010-01-20 16:48:39