C++ 在C+中计算文本文件中的字母数字字符+;
我写了一个程序来计算文本文件中字母数字字符的数量。但是,它返回的数字始终大于联机字符计数器返回的数字 例如,程序将计算此文本中的字母数字字符数: 如果这些人有奇怪的时尚,最期待的是服从 他们至少已经准备好为自己的事业付出代价 偏心率 162岁。再次运行该程序,它将显示文本中有164个字符。再运行一次,它会显示156个字符。使用联机字符计数器时,字符计数似乎应该低于144(联机字符计数器也包括空格) 代码如下:C++ 在C+中计算文本文件中的字母数字字符+;,c++,text-files,alphanumeric,C++,Text Files,Alphanumeric,我写了一个程序来计算文本文件中字母数字字符的数量。但是,它返回的数字始终大于联机字符计数器返回的数字 例如,程序将计算此文本中的字母数字字符数: 如果这些人有奇怪的时尚,最期待的是服从 他们至少已经准备好为自己的事业付出代价 偏心率 162岁。再次运行该程序,它将显示文本中有164个字符。再运行一次,它会显示156个字符。使用联机字符计数器时,字符计数似乎应该低于144(联机字符计数器也包括空格) 代码如下: #include <iostream> #include <fstr
#include <iostream>
#include <fstream>
#include <cctype>
using namespace std;
int main() {
char line[100];
int charcount = 0;
ifstream file("pg1661sample.txt");
while (!file.eof()) {
file.getline(line, 99);
for (int i = 0; i < 100; i++) {
if (isalnum(line[i])) {
charcount++;
}
}
}
cout << endl << "Alphanumeric character count: " << charcount;
cin.get();
return 0;
}
#包括
#包括
#包括
使用名称空间std;
int main(){
字符行[100];
int charcount=0;
ifstream文件(“pg1661sample.txt”);
而(!file.eof()){
file.getline(第99行);
对于(int i=0;i<100;i++){
if(isalnum(第[i]行){
charcount++;
}
}
}
cout您假设getline()
正好用100个字符填充line
。检查getline()
读取的字符串长度,例如使用:
for(int i=0;i
编辑:另外,请确保您听取了其他答案的建议,使用循环条件的getline()
返回值,而不是调用eof()
不要执行此操作。eof()在尝试输入失败后才会返回true,因此类似这样的循环会额外运行一段时间。相反,请执行以下操作:
while (!file.getline(line, 99)) {
当输入结束时,循环将终止
另一个问题是在计数字符的循环中。问问自己:在每次通过输入循环时,有多少字符被读入缓冲区?那么,为什么计数循环看起来是100个字符?试试:
#include <iterator>
#include <algorithm>
#include <iostream>
#include <cctype>
bool isAlphaNum(unsigned char x){return std::isalnum(x);}
int main()
{
std::cout << "Alphanumeric character count: " <<
std::count_if(std::istream_iterator<char>(std::cin),
std::istream_iterator<char>(),
isAlphaNum
) ;
}
最好始终这样做:
while(file.getline(line, 99))
只有当getline实际工作时,才会进入循环
您还使用了错误版本的getline(因为行可能超过100个字符)。
尝试使用与std::string一起使用的版本,使其自动展开
std::string line;
while(std::getline(file, line))
{
// stuff
}
接下来,假设行正好是100个字符。
如果行只有2个字符长,会发生什么
for (int i = 0; i < 100; i++)
for(int i=0;i<100;i++)
基本上,您将扫描数据,它将统计上一行的剩余字母(如果上一行比当前行长)或完全随机的垃圾。如果您仍在使用file.getline()
,则可以使用file.gcount()从一行中检索字符数
。如果使用std::getline(),则变量line
将是读取的行的精确大小(line.size()
)。请阅读:@jrok,也可能是他在最后读取时仅计算字符串末尾的alnums(在任何情况下都是off by 1)这似乎已经解决了这个问题。谢谢!:)我明白了!谢谢你的全面回答!我通常喜欢这个答案,但是,它不是可移植的!来自
的函数只能用正值调用,但是你的代码会在有char
签名的系统上创建负值。为了避免这种情况,你应该将你的测试声明为bool isAlphaNum(unsigned char)
。此声明保证所有char
值都转换为std::isalnum()
的适当int
参数。从性能角度看,我还将使用std::istream\u迭代器
而不是std::istream\u迭代器
(不是前者中的buf
)。
while(file.getline(line, 99))
std::string line;
while(std::getline(file, line))
{
// stuff
}
for (int i = 0; i < 100; i++)