C++ 如何计算文件中的字符数

C++ 如何计算文件中的字符数,c++,c++11,C++,C++11,当我得到 max++ 我有这个,但它是一个无限循环您得到的是一个无限循环,因为istream::get返回一个整数,该整数要么是从文件中读取的字符,要么是EOF文件结束标记,除非读取“\0”字符,否则这两个整数都不会计算为false 你可能会想要这个: while (istr.get() != std::char_traits<char>::eof()) max++; 以下是来自的返回值说明 第一个签名Tree将返回字符读取,如果流中没有可用字符,则返回文件结束值EOF。注意,

当我得到 max++


我有这个,但它是一个无限循环

您得到的是一个无限循环,因为istream::get返回一个整数,该整数要么是从文件中读取的字符,要么是EOF文件结束标记,除非读取“\0”字符,否则这两个整数都不会计算为false

你可能会想要这个:

while (istr.get() != std::char_traits<char>::eof())
  max++;

以下是来自的返回值说明

第一个签名Tree将返回字符读取,如果流中没有可用字符,则返回文件结束值EOF。注意,在这种情况下,还将设置failbit标志

EOF的另一个参考:

它是int类型的宏定义,通常扩展为负整数常量表达式,-1


由于负整数被认为是真的,因此while循环将永远不会结束。

您将得到一个无限循环,因为您使用的get重载仅在读取值“\0”时返回一个转换为false的值。您想测试std::char\u traits::eof

由于get操作在读取字符之前检查流是否处于良好状态,因此该方法必然会非常缓慢。我个人肯定更喜欢使用算法:

max = std::distance(std::istreambuf_iterator<char>(istr),
                    std::istreambuf_iterator<char>());
遗憾的是,这可能仍然不是确定流中字符数的最有效方法。如果不进行测量,我想对于大多数实现来说,这将是最快的方法:

istr.ignore(std::numeric_limits<std::streamsize>::max());
max = istr.gcount();

vu1p3n0x、Jiangehong Jiang和Dietmar已经指出了如何修复当前代码,但只想指出另一个更符合您尝试精神的选项:

char c;
while (istr.get(c)) 
    max++;
当通过引用提供要获取的字符时,它要求输入流存储检索到的字符(如果该字符中有)。然后,getc调用返回对istream的引用,谢天谢地,在布尔上下文中测试它确实可以直观地检查输入操作是否成功,即循环在EOF处终止

也就是说,使用filesystem::file_size(文件大小)(请参见我在问题本身下的评论)效率要高得多。

这可能会有所帮助

int count; //variable to save the count

   do{
      count=istr.tellg();
      istr.get();

   } while( istr.tellg()>0 );


实际上,不是EOF,而是std::char\u traits::EOF。文件结尾值保证不为0,因为这是一个valud char值。这个值是STD::CARY:(如果你可以使用C++ 17,你可能想考虑使用:链接有例子。当然,filesystem::file_的大小注定不起作用。我能想到的最直接的例子是:1。流实际上不是一个文件;2.文件在非POSIX系统上以文本模式打开,使用行尾序列,例如LF/CR;3.使用的std::codecvt方面不是C方面。最好得到正确的结果,而不是快速的结果。
int count;

for(; !(istr.get() & 0) && (istr.tellg()>0); count=istr.tellg());