如何在 C++ 中计算文件的行数?

Posted

技术标签:

【中文标题】如何在 C++ 中计算文件的行数?【英文标题】:How to count lines of a file in C++? 【发布时间】:2011-03-05 14:34:22 【问题描述】:

如何使用标准类 fstreamifstream 计算行数?

【问题讨论】:

闻起来像家庭作业——到目前为止你尝试过什么? 从 '1' 开始并不断为文件中的每一行加 1。 @Noah:空文件只有一行? @Martin - 你是对的。失败。 这一定是个骗子,因为我写了一篇博文,是基于另一个时候有人在 Stack Overflow 上提出这个问题的。 adrianmccarthy.com/blog/?p=37 【参考方案1】:

这个怎么样:-

  std::ifstream inFile("file"); 
  std::count(std::istreambuf_iterator<char>(inFile), 
             std::istreambuf_iterator<char>(), '\n');

【讨论】:

@fingerprint211b:在结果中加一 :-) 无论您是否在文件末尾有换行符,总是需要权衡取舍。 @fingerprint211b:那么就少了一行。仅仅因为最后一行是空白的并不意味着它与任何其他行有任何不同。 美丽优雅。喜欢那个 STL。 @MIH:快速谷歌搜索会告诉你std::count()&lt;algorithm&gt; 中。 @MIH1406: #include &lt;algorithm&gt;【参考方案2】:

您逐行读取文件。 数一数你读了多少行。

【讨论】:

这听起来像一个巨大过度复杂化! ;-) 哪个是正确的。使用缓冲区读取是捕获非 POSIX eof 的唯一方法。【参考方案3】:

这是 Craig W. Wright 答案的正确版本:

int numLines = 0;
ifstream in("file.txt");
std::string unused;
while ( std::getline(in, unused) )
   ++numLines;

【讨论】:

std::getline(in, std::string()) - 将非常量引用绑定到临时文件是不合法的 C++。【参考方案4】:

@Abhay 之后的内核方法

我完成的完整代码:

size_t count_line(istream &is)

    // skip when bad
    if( is.bad() ) return 0;  
    // save state
    std::istream::iostate state_backup = is.rdstate();
    // clear state
    is.clear();
    std::istream::streampos pos_backup = is.tellg();

    is.seekg(0);
    size_t line_cnt;
    size_t lf_cnt = std::count(std::istreambuf_iterator<char>(is), std::istreambuf_iterator<char>(), '\n');
    line_cnt = lf_cnt;
    // if the file is not end with '\n' , then line_cnt should plus 1  
    is.unget();
    if( is.get() != '\n' )  ++line_cnt ;  

    // recover state
    is.clear() ; // previous reading may set eofbit
    is.seekg(pos_backup);
    is.setstate(state_backup);

    return line_cnt;

它不会改变原始文件流状态,包括最后一行的'\n'-miss 情况处理。

【讨论】:

为空白文件或无文件返回 1。 我认为0可能更好? yes 如果文件中没有任何内容或文件不存在,则需要 0。但是这个函数对于空白文件返回零。 如果blank file是一个只有空格的文件,函数可以按预期返回1~【参考方案5】:
int aNumOfLines = 0;
ifstream aInputFile(iFileName); 

string aLineStr;
while (getline(aInputFile, aLineStr))

    if (!aLineStr.empty())
        aNumOfLines++;


return aNumOfLines;

【讨论】:

空行仍然是一行,所以empty()检查应该去掉。 @RemyLebeau 取决于您如何定义 OP 未指定的行。【参考方案6】:

这对我有用:

  std::ifstream fin"source.txt";
  std::count(std::istream_iterator<char>(fin >> std::noskipws), , '\n');

【讨论】:

【参考方案7】:

int numLines = 0;
ifstream in("file.txt");
//while ( ! in.eof() )
while ( in.good() )

   std::string line;
   std::getline(in, line);
   ++numLines;

如果文件的最后一行不以换行符结尾,那么如何处理文件的最后一行是一个问题。根据你在做什么,你可能想要计算它,你可能不会。这段代码很重要。

见:http://www.cplusplus.com/reference/string/getline/

【讨论】:

while ( ! in.eof() ) std::getline作为while的条件。 编辑后它仍然无效,因为如果std::getline 失败,你会增加行数,直到之后才检查它是否成功。将std::getline 移动到while 条件中。【参考方案8】:

将文件大小除以每行的平均字符数!

【讨论】:

如何在不读取文件的情况下确定每行的平均字符数?如果您计算字符,您不妨只计算换行符;哪种会使您的答案无效。 太棒了!我从前辈那里得到的 99.99% 的代码都是这样写的!

以上是关于如何在 C++ 中计算文件的行数?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中计算文本文件中的文本行数时出错

PowerShell:如何计算 csv 文件中的行数?

Qt - 如何计算 .txt 文件中的行数

C++文件读写操作如何统计文本的行数及如何读取文件某一行内容

如何计算java中textArea中段落的行数? [复制]

如何在 C++ 中获取二维动态数组的行数和列数