使用C ++查找文本文件中有多少行

时间:2010-05-10 07:38:19

标签: c++ file-io g++

我的C ++程序需要知道某个文本文件中有多少行。我可以用getline()和while循环来做,但是有更好的方法吗?

6 个答案:

答案 0 :(得分:4)

没有

除非您的操作系统的文件系统跟踪行数,否则系统几乎肯定不会,因为我已经看过很长时间了。

答案 1 :(得分:2)

通过“另一种方式”,你的意思是更快的方式吗?无论如何,您都需要阅读文件的全部内容。读取不同大小的块应该不重要,因为操作系统或底层文件库(或两者)都在缓冲文件内容。

如果在一个非常大的文件中只有几行(高瞬态内存使用率),

getline可能会出现问题,因此您可能希望读取固定大小的4KB块并逐个处理它们。

答案 2 :(得分:1)

使用get()迭代文件char-by-char,并为每个换行符(\n)逐行增加行号。

答案 3 :(得分:1)

最快但依赖于操作系统的方法是将整个文件映射到内存(如果不能一次映射整个文件 - 按顺序将其映射到块中)并调用std::count(mem_map_begin,mem_map_end,'\n')

答案 4 :(得分:0)

不知道getline()是否最好 - 缓冲区大小在最坏情况下是可变的(\ n的序列)它可以在每次迭代中逐字节读取。

对我来说,以预定大小的块读取文件会更好。而不是扫描新线编码的数量(内部。 虽然存在一些风险但我不知道如何解决:其他文件编码而不是ASCII。如果getline()处理的比最容易,但我不认为这是真的。

一些网址:

Why does wide file-stream in C++ narrow written data by default?

http://en.wikipedia.org/wiki/Newline

答案 5 :(得分:0)

可能最快的方法是使用低级读()和扫描缓冲区'\ n':

int clines(const char* fname)
{
    int nfd, nLen;
    int count = 0;
    char buf[BUFSIZ+1];

    if((nfd = open(fname, O_RDONLY)) < 0) {
        return -1;
    }

    while( (nLen = read(nfd, buf, BUFSIZ)) > 0 )
    {
        char *p = buf;
        int n = nLen;
        while( n && (p = memchr(p,'\n', n)) ) {
            p++;
            n = nLen - (p - buf);
            count++;
        }
    }
    close(nfd);
    return count;
}