我正在尝试计算每个字母在文件中出现的次数。当我运行下面的代码时,它会计算“Z”两次。谁能解释一下为什么?
测试数据为:
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
#include <iostream> //Required if your program does any I/O
#include <iomanip> //Required for output formatting
#include <fstream> //Required for file I/O
#include <string> //Required if your program uses C++ strings
#include <cmath> //Required for complex math functions
#include <cctype> //Required for letter case conversion
using namespace std; //Required for ANSI C++ 1998 standard.
int main ()
{
string reply;
string inputFileName;
ifstream inputFile;
char character;
int letterCount[127] = {};
cout << "Input file name: ";
getline(cin, inputFileName);
// Open the input file.
inputFile.open(inputFileName.c_str()); // Need .c_str() to convert a C++ string to a C-style string
// Check the file opened successfully.
if ( ! inputFile.is_open())
{
cout << "Unable to open input file." << endl;
cout << "Press enter to continue...";
getline(cin, reply);
exit(1);
}
while ( inputFile.peek() != EOF )
{
inputFile >> character;
//toupper(character);
letterCount[static_cast<int>(character)]++;
}
for (int iteration = 0; iteration <= 127; iteration++)
{
if ( letterCount[iteration] > 0 )
{
cout << static_cast<char>(iteration) << " " << letterCount[iteration] << endl;
}
}
system("pause");
exit(0);
}
最佳答案
正如其他人所指出的,您在输入中有两个 Q。你有两个 Z 的原因是最后一个
inputFile >> character;
(可能当流中只剩下一个换行符时,因此不是 EOF)无法转换任何内容,在上一次迭代的全局“字符”中留下“Z”。之后尝试检查 inputFile.fail() 以查看:
while (inputFile.peek() != EOF)
{
inputFile >> character;
if (!inputFile.fail())
{
letterCount[static_cast<int>(character)]++;
}
}
编写循环的惯用方法是:
while (inputFile >> character)
{
letterCount[static_cast<int>(character)]++;
}
关于c++ - 计算文件中字母的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5206448/