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

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

【问题讨论】:

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

标签: c++ file-io io fstream ifstream


【解决方案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% 的代码都是这样写的!
    猜你喜欢
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    相关资源
    最近更新 更多