C++ 在C+中计算文本文件中的字母数字字符+;

C++ 在C+中计算文本文件中的字母数字字符+;,c++,text-files,alphanumeric,C++,Text Files,Alphanumeric,我写了一个程序来计算文本文件中字母数字字符的数量。但是,它返回的数字始终大于联机字符计数器返回的数字 例如,程序将计算此文本中的字母数字字符数: 如果这些人有奇怪的时尚,最期待的是服从 他们至少已经准备好为自己的事业付出代价 偏心率 162岁。再次运行该程序,它将显示文本中有164个字符。再运行一次,它会显示156个字符。使用联机字符计数器时,字符计数似乎应该低于144(联机字符计数器也包括空格) 代码如下: #include <iostream> #include <fstr

我写了一个程序来计算文本文件中字母数字字符的数量。但是,它返回的数字始终大于联机字符计数器返回的数字

例如,程序将计算此文本中的字母数字字符数:

如果这些人有奇怪的时尚,最期待的是服从 他们至少已经准备好为自己的事业付出代价 偏心率

162岁。再次运行该程序,它将显示文本中有164个字符。再运行一次,它会显示156个字符。使用联机字符计数器时,字符计数似乎应该低于144(联机字符计数器也包括空格)

代码如下:

#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++)