如何重置.get()
How to reset .get()
我正试图从一个文件中找到字母表中的字母数量。我可以得到第一个字母A来给我正确的数字,但当for循环通过时,它只给我剩下的字母0。我觉得这与我的.get()没有再次从文件开头开始有关。我需要做些什么来解决这个问题?谢谢
ifstream openFile("data.txt");
int numberOfLetters(0);
char letter;
for (int i = 0; i < 26; i++)
{
numberOfLetters = 0;
openFile.clear();
while (!openFile.eof())
{
openFile.get(letter);
if (letter == char(i + 97) || letter == char(i + 65))
{
numberOfLetters++;
}
}
cout << numberOfLetters;
}
问题在于外部循环:看起来您想使用此循环来检查从文件中提取的字符是否等于某个范围中的某些字符。如果是这种情况,那么在循环中执行输入并不是一种可行的方法。
在循环的第一次迭代中,文件将被完全读取,这样到第二次迭代时,openFile.get(letter)
不会将任何内容提取到letter
中,只保留其先前的值,其余外部迭代也是如此。肯定是previous
的最后一个值没有通过if()
语句测试,所以numberOfLetter
没有增加。
解决方案是更改检查字符是否为字母的方式。字符使用ASCII格式表示,ASCII格式只是映射到字符的整数。由于字符实际上是整数,因此可以对它们使用算术运算。此外,字符在ASCII中按字母顺序表示,因此您可以简单地比较它们的值,看看它们是否在字母字符的范围内:
while (openFile.get(letter))
{
if (('a' <= letter && letter <= 'z') || ('A' <= letter && letter <= 'Z'))
{
numberOfLetters++;
}
}
cout << numberOfLetters;
幸运的是,标准库提供了一个函数std::isalpha()
,可以为您完成这项工作。
...
if (std::isalpha(letter))
{
numberOfLeters++;
}
...
根据你的评论,检查一个字符是否是字母是不够的。相反,使用像std::map
这样的数据结构来保持某些字符的总数:
#include <map>
std:map<char, std::size_t> alpha_count;
while (openFile.get(letter))
{
if (std::isalpha(letter))
alpha_count[letter]++;
}
现在要打印有多少特定字符,请循环浏览地图并打印字符的count()
:
for (auto&& c : alpha_count)
{
std::cout << "# of " << c << ": " << alpha_count.count(c) << 'n';
}
相关文章:
- QTableView:endMoveRows在模型中重置水平页眉大小
- 更改"child's parent's style sheet"时如何将孩子的样式表重置为 Qt 默认样式表?
- 切换大小写后如何阻止变量重置?
- 当客户端在 write() 期间终止连接时,由对等套接字错误重置连接
- 移动后是否需要重置标准::列表?
- 在读取文件后重置句柄
- C++变量在调用 x64 程序集函数后重置为 0
- Adafruit 羽毛RFM69HCW在使用过程中会冻结,需要硬重置
- 变量始终在函数中重置为默认值
- 为什么我的 LogError 函数会重置 GetLastError?
- 无法重置 std::shared_ptr 标准::设置<>中的对象...为什么?
- C++上的手动重置事件(来自 C#)实现:如何避免争用条件
- 如何在IQualProp::get_AvgFrameRate中重置帧速率?
- 奇怪的UC3 用户页面 NVRAM 使用后重置行为
- 如何在接触时重置我的角色位置?
- C++ - 重置字符串流不会重置获取位置或清除标志吗?
- 重置 std::shared_ptr 会导致重置其删除器吗?
- 为什么重置引用时没有收到错误?
- DirectX 9 在重置调用之间保留状态
- 如何重置.get()