while (istr.get())
max++;
我有这个,但它是一个无限循环
答案 0 :(得分:2)
你得到一个无限循环,因为istream::get()
返回一个整数,该整数是从文件中读取的字符,或者是EOF(文件结束)标记,它们都不计算为false(除非{{ {1}}字符被读取。)
你可能想要这个:
'\0'
答案 1 :(得分:2)
vu1p3n0x,Jiehong Jiang和Dietmar已经指出了如何修复你当前的代码,但只是想指出另一个更符合你尝试精神的选择:
char c;
while (istr.get(c))
max++;
当您提供要获取的字符(通过引用)时,它会要求输入流将检索到的字符(如果有)存储在该字符中。 get(c)
调用然后返回对istream
的引用,幸运的是在布尔上下文中测试它确实以直观的方式检查输入操作是否成功(即循环终止于EOF)。 / p>
那就是说 - 使用filesystem::file_size
- 看看我在问题本身下的评论 - 效率更高。
答案 2 :(得分:0)
这是http://www.cplusplus.com/reference/istream/istream/get/
的返回值说明如果流中没有可用的字符,则第一个签名
get()
返回字符读取或文件结束值(EOF)(请注意,在这种情况下,还会设置failbit标志)。
EOF的另一个参考:
这是int类型的宏定义,它扩展为负整数常量表达式(通常为-1)。
由于负积分被认为是真的,你的while循环永远不会结束。
答案 3 :(得分:0)
您获得无限循环,因为您使用的.then
重载仅在读取值get()
时返回转换为false
的值。您想要为'\0'
进行测试。
由于std::char_traits<char>::eof()
操作在读取字符之前检查流是否处于良好状态,因此方法必然相当慢。我个人肯定更喜欢使用算法:
get()
可悲的是,这可能仍然不是确定流中字符数的最有效方法。如果不测量它,我会猜测对于大多数实现来说,这将是最快的方法:
max = std::distance(std::istreambuf_iterator<char>(istr),
std::istreambuf_iterator<char>());
答案 4 :(得分:0)
这可能会有所帮助
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());