我的C ++程序需要知道某个文本文件中有多少行。我可以用getline()和while循环来做,但是有更好的方法吗?
答案 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?
答案 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;
}