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

时间:2018-11-02 04:18:05

标签: c++ integer character text-files

我试图用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。

有人可以给我一些建议吗?

非常感谢!

4 个答案:

答案 0 :(得分:1)

尝试将令牌读入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;
    }
}

答案 1 :(得分:1)

您的while循环没有执行您认为的操作。 它只会重复一条语句:

in >> value;

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

答案 2 :(得分:1)

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

本质上,请尝试将每个元素读入字符并检查数字功能。如果您正在阅读的元素不只是长度1,则必须进行一些修改。让我知道是否是这种情况,我会尽力帮助!

$http.get('LabelsPDF?ids=' + ids, { responseType: 'arraybuffer' })
            .then(function (response) {
                var file = new Blob([response.data], { type: 'application/pdf' });
                var fileURL = URL.createObjectURL(file);
                $scope.ContentPDF = $sce.trustAsResourceUrl(fileURL);
            });

<embed ng-src="{{ContentPDF}}" type="application/pdf" class="col-xs-12" style="height:100px; text-align:center;" />

答案 3 :(得分:1)

由于看上去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;消耗并丢弃。有效地捕获有点棘手,{{3} }。如果认为stod的异常处理代价昂贵,请covered by William Lee's answer并测试end参数是否到达字符串的末尾,并且不生成范围错误。请参见use strtod

中的示例