你如何计算文件中的字符
How do you count the characters in a file
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());
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 如何在C++中确定文本文件中的元素是字符还是数字
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- 如何从文本文件中读取数值,直到遇到字符类型?
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- 如何像在 C++ 中处理数组一样对 .txt 文件中的字符进行寻址?
- 尝试将字符串从文件读取到无符号字符向量中
- 如何在C++中反转文本文件中字符的顺序?
- 生成随机.txt文件,10行,10列。充满随机:"*"、"#"、"@"。然后将随机字符替换为'P'
- 如何存储 unicode 字符并将其输出到文件?
- 无法将整个文本文件复制到字符数组
- C++逐个字符读取二进制文件字符
- 如何将所有文件字符转换为大写或小写
- 如何通过C 读取CHAR的文件字符
- 无法写入文件字符指针
- 在 c++ 中逐个从文件字符读取
- Boost:如何检查文本文件字符编码/字符集
- 文件字符编码
- c++ -读取文件字符时的无限循环
- 创建一个大尺寸的char类型数组并复制文件字符