基本问题在这里。我正在读取一个文件,并将文件中的值写入无符号整数,如下所示:
// 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);
答案 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);