如何在C++;文本文件中的元素是字符还是数字? 我试图在C++中编写一个代码,读取一个包含一系列数值的文本文件。例如,我有一个.txt文件,其中包含以下一系列数字和一个字符: 1 2 3 a 5
我试图使代码能够识别数字和字符,例如上面的第四个条目(这是一个字符),然后报告错误 我现在做的就像如何在C++;文本文件中的元素是字符还是数字? 我试图在C++中编写一个代码,读取一个包含一系列数值的文本文件。例如,我有一个.txt文件,其中包含以下一系列数字和一个字符: 1 2 3 a 5,c++,integer,character,text-files,C++,Integer,Character,Text Files,我试图使代码能够识别数字和字符,例如上面的第四个条目(这是一个字符),然后报告错误 我现在做的就像 double value; while(in) { in >> value; if(!isdigit(value)) { cout << "Has non-numeric entry!" << endl; break; } else // some codes for storing the entry }
double value;
while(in) {
in >> value;
if(!isdigit(value)) {
cout << "Has non-numeric entry!" << endl;
break;
}
else
// some codes for storing the entry
}
双值;
当{
在>>值中;
如果(!isdigit(值)){
cout尝试将标记读入字符串
并显式解析它
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;
}
}
ifstream-infle(“data.txt”);
字符串标记;
而(加密>>令牌){
试一试{
double num=stod(令牌);
cout您的,而循环并不会做您认为它会做的事情。
它只迭代一条语句:
in >> value;
其余语句实际上在循环之外。
我创建了一个小型脚本,通过标准的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;
}
intmain(){
std::fstream fin(“detect_char.txt”);
字符x;
而(fin>>x){
如果(!isdigit(x)){
std::cout既然询问者的最终目标似乎是为了他们自己的邪恶目的而拥有一个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
}
}
双值;
while(in)//循环直到在错误处理案例之后失败
{
if(在>>值中)//读取一个double。
{
std::cout>junk;//我所知道的阅读任何whitepsace的最简单方法。
//如果丢弃很长并且字符串大小调整了,那就有点恶心了
}
}
警告:
它不能处理的是像3.14A这样的东西。它将被读取为3.14并停止,返回3.14并将A留给下一次读取,在那里它将无法解析,然后被垃圾中的消费和丢弃;
有效地捕获它有点棘手。如果stod
的异常处理被认为是昂贵的,然后测试end
参数是否到达字符串的末尾,并且没有生成范围错误。请参见Readchar
s中的示例,而不是double
s,您会发现isdigit
更有效。好的。我正在找出混淆的地方。在>>值中;
有不同的行为取决于value
的类型。如果value
是double
,它将尝试读取浮点数。如果value
是int
它将尝试读取整数。如果value
是字符串,它将尝试读取一组字符,直到下一个空格。如果value
是MyCustom类
您需要提供一个知道如何读取MyCustomClass
的类。如果这些>
重载中的任何一个都不能将流中的内容转换为任何值
它是不是停止并返回它已成功转换的内容,还是在中的中设置错误标志,并将其留给程序员进行排序混乱。因为你不知道你将要接收什么,你必须阅读最低公分母字符,然后自己转换字符。你可以使用你的double
值,但不是检查isdigit
,你需要检查流上是否设置了failbit
,指示无效通过检查in.fail()
,输入(例如,非数字(或+/e-.
)匹配失败)。这应该在检查in.eof()| | in.bad()后完成
。见Great googly moogly。终于有人得到了它。+1.介意我稍微修改一下格式吗?@user4581301是的,如果有帮助,一定要修改一下!@bolov我不确定你的意思?在这个过程中,所有的空格都会被忽略。老实说,@bolov,我必须查一下。我很久没有用
读入字符了ter.我认为Drimik有权这样做。原始代码甚至没有编译。它包含一个中断
,没有嵌套在任何循环中,因为while主体缺少大括号,因此只包含一条语句:in>>value;
。所以要么修复原始帖子,要么至少在下面投票我的答案,指出它。更好。现在我如果你得到更多的反对票,那可能是因为使用异常捕获非异常事件(你知道输入中会有非数字字符)是一个相当重要的解决方案。我在我的原始代码中添加了大括号。这里只是一个输入错误。