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