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

使用C++;找出一个文本文件中有多少行 我的C++程序需要知道某个文本文件中有多少行。我可以用getline()和while循环来完成,但是有更好的方法吗?,c++,file-io,g++,C++,File Io,G++,用get()逐个字符地迭代文件,并且对于每个换行(\n)将行号增加一个。用get()逐个字符地迭代文件,对于每个换行(\n)将行号增加一个。否 除非您的操作系统的文件系统记录行数,否则您的系统几乎肯定不会记录行数,因为我已经很久没有看到了。没有 除非您的操作系统的文件系统跟踪行数,否则您的系统几乎肯定不会跟踪行数,因为从我看到这一点已经很久了。所谓“另一种方式”,是指更快的方式吗?不管怎样,您都需要读入文件的全部内容。读取不同大小的数据块应该没有多大关系,因为操作系统或底层文件库(或两者)正在缓

用get()逐个字符地迭代文件,并且对于每个换行(
\n
)将行号增加一个。

用get()逐个字符地迭代文件,对于每个换行(
\n
)将行号增加一个。

除非您的操作系统的文件系统记录行数,否则您的系统几乎肯定不会记录行数,因为我已经很久没有看到了。

没有

除非您的操作系统的文件系统跟踪行数,否则您的系统几乎肯定不会跟踪行数,因为从我看到这一点已经很久了。

所谓“另一种方式”,是指更快的方式吗?不管怎样,您都需要读入文件的全部内容。读取不同大小的数据块应该没有多大关系,因为操作系统或底层文件库(或两者)正在缓冲文件内容

getline
如果一个非常大的文件中只有几行(瞬时内存使用率很高),则可能会出现问题,因此您可能希望读取固定大小的4KB块并逐个处理它们

你说的“另一种方式”是指更快的方式吗?不管怎样,您都需要读入文件的全部内容。读取不同大小的数据块应该没有多大关系,因为操作系统或底层文件库(或两者)正在缓冲文件内容


getline
如果一个非常大的文件中只有几行(瞬时内存使用率很高),则可能会出现问题,因此您可能希望读取固定大小的4KB块并逐个处理它们

最快但依赖于操作系统的方法是将整个文件映射到内存(如果不可能一次映射整个文件,则按顺序将其映射到块中),并调用
std::count(mem\u-map\u-begin,mem\u-map\u-end,'\n')
最快的方法是将整个文件映射到内存(如果不可能一次映射整个文件-按顺序将其映射成块)并调用
std::count(mem\u map\u begin,mem\u map\u end,'\n')
不知道
getline()
是否是最佳的-缓冲区大小在最坏的情况下是可变的(顺序为\n),它可以在每次迭代中读取一个字节接一个字节

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

某些url:


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

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

某些url:


可能最快的方法是使用低级别读取()和扫描缓冲区以获取“\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;
}
int clines(常量字符*fname)
{
国际nfd,nLen;
整数计数=0;
字符buf[BUFSIZ+1];
如果((nfd=open(fname,orduonly))<0){
返回-1;
}
而((nLen=read(nfd,buf,BUFSIZ))>0)
{
char*p=buf;
int n=nLen;
而(n&(p=memchr(p,'\n',n))){
p++;
n=nLen-(p-buf);
计数++;
}
}
关闭(nfd);
返回计数;
}

可能最快的方法是使用低级别read()和扫描'\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;
}
int clines(常量字符*fname)
{
国际nfd,nLen;
整数计数=0;
字符buf[BUFSIZ+1];
如果((nfd=open(fname,orduonly))<0){
返回-1;
}
而((nLen=read(nfd,buf,BUFSIZ))>0)
{
char*p=buf;
int n=nLen;
而(n&(p=memchr(p,'\n',n))){
p++;
n=nLen-(p-buf);
计数++;
}
}
关闭(nfd);
返回计数;
}

这种方法比我刚才说的更糟糕。我试图避免在中读取整个文件。@knittl:你怎么知道?听说过过早优化吗?@Phenom:没有-逐字符方法和getline方法做完全相同的事情-它们读取整个文件寻找行尾字符。这将比
getl更快ine()
。最快的方法是
mmap()
文件,然后计数
\n
s。@Phenom RE:“避免在中读取整个文件”-除非您对这些文件进行了预处理或有索引,否则您必须读取文件的所有内容。您不一定要将整个文件存储在内存中,但在某个时候,您将读取文件的每个字节。这种方法比我所说的方法更糟糕。我试图避免在内存中读取整个文件。@奈特尔:你怎么知道?听说过过早优化吗?@Phenom:没有-逐字符方法和getline方法做完全相同的事情-他们读取整个文件寻找行尾字符。这将比
getline()
快。最快的方法是
mmap()
读取文件,然后计数
\n
s.@Phenom RE:“避免在中读取整个文件”-除非您对这些文件进行了预处理或有一些索引,否则您必须读取文件的所有内容。您不必将整个文件都存储在内存中,但在某个时候您将读取文件的每个字节。我认为
getline()
是您无法避免读取整个文件的方法。根据平台的不同,可能会有一些不可移植的优化,但是<