检查有效的输入C ++

时间:2013-11-30 01:27:35

标签: c++ string file validation

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

// 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);

2 个答案:

答案 0 :(得分:3)

分两步完成:

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

答案 1 :(得分: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);