我试图用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。
有人可以给我一些建议吗?
非常感谢!
答案 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