c++ - 计算文本文件中的数字
问题描述
我正在编写一个简单的 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;
}
解决方案
让我们从适用于您要编写的所有程序的两个非常重要的事情开始:
永远不要不受约束地读入缓冲区 - 永远!这是黑客试图通过覆盖缓冲区之后的内容来破坏您的程序的主要攻击媒介。始终将输入限制为允许的最大空间,例如,使用 设置缓冲区的宽度
std::setw(liczby)
。在 C++ 中的几乎所有情况下,您都希望使用std::string
而不是固定大小的字符缓冲区。这些没有缓冲区溢出问题(可能仍然需要限制它们占用的最大空间量,这可以通过分配器完成)。在使用输入之前,请始终测试输入是否成功。这样做并不涉及
stream.eof()
,因为该条件仅在程序用尽所有输入时才成立。此外,您还需要在阅读后进行检查(因为循环不是以惯用方式编写的,我没有注意到您实际上确实进行了检查if (we)
;不过,值得以惯用方式编写循环)。例如,您的循环可能看起来像(如果不是第二点):while (we >> std::setw(sizeof(liczby) >> liczby) { // ... }
由于您的程序仅尝试读取单词,因此它显然只计算单词的数量。要计算似乎是您的作业的数字序列的“数字”,您需要检查给定的单词是否仅包含数字(如果您尝试使用std::isdigit()
from<ccctype>
请注意,此功能仅接受正数int
,而char
通常签名,即,您需要char
在将它们输入 )unsigned char
之前将其转换为std::isdigit()
)。不过,我将实际实现留作练习。
推荐阅读
- javascript - CSS left !important 不会覆盖之前的左侧值
- css - 使用带有动画渐变的文本阴影
- javascript - 如何按相同的值对 JSON 数据进行排序?
- python-3.x - 从目录访问文件
- android - 如何使用 ADB 将一些文本复制到 android 系统剪贴板?
- django - 通过 Heroku Github 管道部署公共 Django 项目而不公开凭据
- macos - npm run watch 在更新到 Mac OS X Mojave 后出现错误
- python - 如何获取输入 gtk.entry 字段的值并在按钮信号之外使用它
- javascript - 如何插入activeTab权限
- javascript - 在 JavaScript 中,如何在不使用正则表达式的情况下用 replace() 函数替换字符串中的多个值?