如何在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
参数是否到达字符串的末尾,并且没有生成范围错误。请参见Read
char
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;
。所以要么修复原始帖子,要么至少在下面投票我的答案,指出它。更好。现在我如果你得到更多的反对票,那可能是因为使用异常捕获非异常事件(你知道输入中会有非数字字符)是一个相当重要的解决方案。我在我的原始代码中添加了大括号。这里只是一个输入错误。