有没有一种简单的机制可以用 C++ 输入流(如
也许更好的做法是:
我想这种解决方案的性能会比实际解析并存储从不需要的值时更好。
可能的解决方案
使用提供的答案制作了此解决方案。它基本上与已接受的答案相同,但不需要临时解决方案。相反,它跳过第一个空格,然后跳过除空格以外的任何字符,直到再次到达空格为止。此解决方案可能使用 2 个 while 循环,但无需知道所提取的类型。我并不是说这是一种高性能的解决方案或任何花哨的东西,但它使得结果代码更短、更清晰和更有表现力。
ifstream
)跳过到下一个空格?我知道如果我知道要跳过多少个字符或者期望什么分隔符,可以使用 ignore
。但是在我看来,当 operator>>
通常只读取到下一个空格而不提供任何额外参数时,使用 ignore
是不美观的。我也可以使用虚拟变量,但那只会使问题更糟。
示例
auto importantInfo1 = 0;
auto importantInfo2 = 0;
auto someDummy = 0; // This is ugly and doesn't clearly express the intent
file >> importantInfo1 >> someDummy >> importantInfo2;
在某些情况下,如果我需要处理“跳过”情况下的不同数据类型,我可能需要多个虚拟变量。
我想象中的解决方法是这样的:
file >> importantInfo1;
file.skip<int>(1);
file >> importantInfo2;
也许更好的做法是:
auto importantInfo1 = 0;
auto importantInfo2 = 0;
file >> importantInfo1 >> skip<int> >> importantInfo2;
我想这种解决方案的性能会比实际解析并存储从不需要的值时更好。
可能的解决方案
使用提供的答案制作了此解决方案。它基本上与已接受的答案相同,但不需要临时解决方案。相反,它跳过第一个空格,然后跳过除空格以外的任何字符,直到再次到达空格为止。此解决方案可能使用 2 个 while 循环,但无需知道所提取的类型。我并不是说这是一种高性能的解决方案或任何花哨的东西,但它使得结果代码更短、更清晰和更有表现力。
template<typename CharT, typename Traits>
inline std::basic_istream<CharT, Traits>& skip(std::basic_istream<CharT, Traits>& stream)
{
while (stream && std::isspace(stream.peek())) stream.ignore();
while (stream && !std::isspace(stream.peek())) stream.ignore();
return stream;
}
int
是一个糟糕的例子,它可以是一个字符串,或者是提供流操作符的一些复杂对象。 - Excelciusscanf
能正常工作吗? - Proxystd::cin >> std::ws
跳过所有的空格。 - Simplescanf
并不是一个真正的选择。 - Excelcius