【问题标题】:Checking for valid input C++检查有效输入 C++
【发布时间】:2013-11-30 01:27:35
【问题描述】:

这里的基本问题。我正在读取一个文件,并将文件中的值写入无符号整数,如下所示:

// The essential stuff
std::ifstream infile(filePath.c_str());

std::getline(infile, line);
std::istringstream in(line);

char type;
in >> type;

unsigned int x, y, z, w;
in >> x >> y >> z >> w;  // My question relates to this here.

问题是:获取 x、y、z 和 w 值可以正常工作,但我希望 w 是可选的。所以一行可能包含f 0 1 2 3(类型,加上4个值),或者它可能只包含f 0 1 2

天真地,我希望 w 会等于 EOF 或类似的东西,但可惜,事实并非如此。

我可以计算行中的空格,并用它来检查w 是否存在。或者我可以使用peek 检查该行是否在 z 之后结束,但这并不是那么简单,因为我也想忽略空格(即 z 和 w 字符之间可能有 10 个空格,这应该仍然有效)。所以解决方案肯定存在,但我想知道是否有......一些更整洁的方法?大概是这样的吧?

writeTo(w);
if w is junk
    disposeOf(w);

【问题讨论】:

    标签: c++ string file validation


    【解决方案1】:

    分两步完成:

    if (in >> x >> y >> z)
    {
         mandatory_stuff(x, y, z);
         if (in >> w)
         {
             optional_stuff(w);
         }
    }
    else
    {
         // malformed input
    }
    

    【讨论】:

    • 完美!我没有意识到 >> 返回了任何东西。作为旁注,我不知道 >> 运算符的名称,这使得 Google 很难......
    【解决方案2】:

    当输入运算符失败时,它将流设置为失败状态,即,它在流中设置状态标志std::ios_base::failbit。设置此标志后,流转换为false,即您可以使用流来查看输入是否成功:

    if (in >> x >> y >> z) {
        if (in >> w) {
            deal_with_all_for_values(x, y, z, w);
        }
        else {
            deal_with_only_the_first_tree(x, y, z);
        }
    }
    

    大多数值仅在读取操作成功时设置,即,如果您想为w 提供特殊值,您可以读取该值,如果它不存在,它将保留其原值:

    int w = 17;
    if (in >> x >> y >> z) {
        in >> w;
        deal_with_the_values(x, y, z, w);
    

    【讨论】:

    • 我尝试将 w 的值输出到控制台,这会给我一些随机值,但在尝试写入之前我实际上并没有将其值设置为任何值,这解释了乱码的结果!内容丰富的答案,谢谢你。
    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    相关资源
    最近更新 更多