开发者

Using C++ to find out how many lines are in a text file

开发者 https://www.devze.com 2022-12-29 14:12 出处:网络
My C++ prog开发者_JAVA技巧ram needs to know how many lines are in a certain text file.I could do it with getline() and a while-loop, but is there a better way?No.

My C++ prog开发者_JAVA技巧ram needs to know how many lines are in a certain text file. I could do it with getline() and a while-loop, but is there a better way?


No.

Not unless your operating system's filesystem keeps track of the number of lines, which your system almost certainly doesn't as it's been a looong time since I've seen that.


By "another way", do you mean a faster way? No matter what, you'll need to read in the entire contents of the file. Reading in different-sized chunks shouldn't matter much since the OS or the underlying file libraries (or both) are buffering the file contents.

getline could be problematic if there are only a few lines in a very large file (high transient memory usage), so you might want to read in fixed-size 4KB chunks and process them one-by-one.


Iterate the file char-by-char with get(), and for each newline (\n) increment line number by one.


The fastest, but OS-dependent way would be to map the whole file to memory (if not possible to map the whole file at once - map it in chunks sequentially) and call std::count(mem_map_begin,mem_map_end,'\n')


Don't know if getline() is the best - buffer size is variable at the worst case (sequence of \n) it could read byte after byte in each iteration.

For me It would be better to read a file in a chunks of predetermined size. And than scan for number of new line encodings ( inside. Although there's some risk I cannot / don't know how to resolve: other file encodings than ASCII. If getline() will handle than it's easiest but I don't think it's true.

Some url's:

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

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


possibly fastest way is to use low level read() and scan buffer for '\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;
}
0

精彩评论

暂无评论...
验证码 换一张
取 消