如何在C++中确定文本文件中的元素是字符还是数字



我正试图用C++编写一段代码,读取一个包含一系列数字的文本文件。例如,我有一个.txt文件,其中包含以下一系列数字和一个字符:

1 2 3 a 5

我正在努力使代码能够识别数字和字符,例如上面的第4个条目(它是一个字符(,然后报告错误。

我正在做的事情就像

double value;
while(in) {
in >> value;
if(!isdigit(value)) {
cout << "Has non-numeric entry!" << endl;
break;
}
else
// some codes for storing the entry
}

但是,isdigit函数不适用于文本文件。当我执行in >> value时,代码似乎会隐式地将a转换为double。

有人能给我一些建议吗?

非常感谢!

您的while循环不会执行您认为的操作。它只迭代一个语句:

in >> value;

其余的语句实际上都在循环之外。始终建议对while正文使用大括号

我创建了一个小的迷你脚本,通过标准的fstream库对象读取文件,因为我有点不确定您的"in"代表什么。

从本质上讲,试着将每个元素都作为字符读取,并检查数字函数。如果您正在读取长度不只是1的元素,则必须进行一些修改。如果是这样的话,请告诉我,我会尽力帮忙的!

int main() {
std::fstream fin("detect_char.txt");
char x;
while (fin >> x) {
if (!isdigit(x)) {
std::cout << "found non-int value = " << x << 'n';
}
}
std::cout << 'n';
return 0;
}

尝试将令牌读取到string中并显式解析为

ifstream infile("data.txt");
string token;
while (infile >> token) {
try {
double num = stod(token);
cout << num << endl;
}
catch (invalid_argument e) {
cerr << "Has non-numeric entry!" << endl;
}
}

由于Asker的最终目标似乎是为了自己的邪恶目的而使用double值,而不是简单地检测数字中是否存在垃圾,这到底是怎么回事。让我们读一篇double

double value;
while (in) // loop until failed even after the error handling case
{
if (in >> value) // read a double.
{
std::cout << value; // printing for now. Store as you see fit
}
else // failed to read a double
{
in.clear(); // clear error
std::string junk; 
in >> junk; // easiest way I know of to read up to any whitepsace. 
// It's kinda gross if the discard is long and the string resizes
}
}

注意事项:

它无法处理的是3.14A之类的东西。它将被读取为3.14并停止,返回3.14并将A留给下一次读取,在下一次读时它将无法解析,然后被in >> junk;占用和丢弃。捕获效率有点棘手,并被William Lee的答案所覆盖。如果stod的异常处理被认为代价高昂,请使用strtod并测试end参数是否到达字符串的末尾,并且没有生成范围错误。参见链接的strtod文档中的示例

最新更新