你如何计算文件中的字符

How do you count the characters in a file

本文关键字:文件 字符 计算 何计算      更新时间:2023-10-16

while (istr.get()) max++;

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

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

char c;
while (istr.get(c)) 
    max++;

当您提供要获取的字符(通过引用(时,它会要求输入流将检索到的字符(如果有(存储在该字符中。 然后get(c)调用返回对istream的引用,值得庆幸的是,在布尔上下文中测试它确实以直观的方式检查输入操作是否成功(即循环在EOF终止(。

也就是说 - 使用filesystem::file_size - 请参阅我在问题本身下的评论 - 效率要高得多。

你会

得到一个无限循环,因为istream::get()返回一个整数,该整数要么是从文件中读取的字符,要么是 EOF(文件结束(标记,这两个标记的计算结果都不为 false(除非读取''字符(。

你可能想要这个:

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

下面是来自 http://www.cplusplus.com/reference/istream/istream/get/的返回值描述

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

EOF的另一个参考:

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

由于负积分被认为是真的,你的while循环永远不会结束。

你会得到一个无限循环,因为你使用的get()重载只返回一个值,当读取值''时,转换为false。您要测试std::char_traits<char>::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();
这可能会

有所帮助

int count; //variable to save the count
   do{
      count=istr.tellg();
      istr.get();
   } while( istr.tellg()>0 );

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