首页 > 解决方案 > 计算文本文件中的数字

问题描述

我正在编写一个简单的 C++ 程序作为我的作业来计算文本文件中的数字数量。下面是我的代码,但不幸的是它计算了单词和数字。我不知道它应该如何计算数字的数量,错误在哪里?

我的文本文件:

lorem ipsum 5 87 451 13

我的代码:

#include <iostream>
#include <cstdio>
#include <fstream>

using namespace std;


int main()
{
    int n=0;
    char plik[100], liczby[100];
    
    string nazwapliku;
    nazwapliku="file.txt";
    
    ifstream we("file.txt");
    
    if (!we)
    {
        cout<<"Can't read file'";
        cin.ignore();
        getchar();
        return 1;
    }
    while (!we.eof())
    {
        we>>liczby;
        if(we)
            n=n+1;
    }
    we.close();
    cout<<"Numbers count in "<<nazwapliku<<" : "<<n;
    getchar();
    return 0;
}

标签: c++count

解决方案


让我们从适用于您要编写的所有程序的两个非常重要的事情开始:

  1. 永远不要不受约束地读入缓冲区 - 永远!这是黑客试图通过覆盖缓冲区之后的内容来破坏您的程序的主要攻击媒介。始终将输入限制为允许的最大空间,例如,使用 设置缓冲区的宽度std::setw(liczby)。在 C++ 中的几乎所有情况下,您都希望使用std::string而不是固定大小的字符缓冲区。这些没有缓冲区溢出问题(可能仍然需要限制它们占用的最大空间量,这可以通过分配器完成)。

  2. 在使用输入之前,请始终测试输入是否成功。这样做并不涉及stream.eof(),因为该条件仅在程序用尽所有输入时才成立。此外,您还需要在阅读进行检查(因为循环不是以惯用方式编写的,我没有注意到您实际上确实进行了检查if (we);不过,值得以惯用方式编写循环)。例如,您的循环可能看起来像(如果不是第二点):

    while (we >> std::setw(sizeof(liczby) >> liczby) {
       // ...
    }
    

由于您的程序仅尝试读取单词,因此它显然只计算单词的数量。要计算似乎是您的作业的数字序列的“数字”,您需要检查给定的单词是否仅包含数字(如果您尝试使用std::isdigit()from<ccctype>请注意,此功能仅接受正数int,而char通常签名,即,您需要char在将它们输入 )unsigned char之前将其转换为std::isdigit())。不过,我将实际实现留作练习。


推荐阅读