是否有任何简单的机制可以使用 C++ 输入流(如ifstream)跳过直到下一个空格?
我知道ignore如果我知道要跳过多少个字符或需要什么分隔符,我就可以使用它。ignore但在我看来,当operator>>通常只是读取下一个空白而不提供任何其他参数时,使用起来很丑陋。我也可以使用假人,但这只会让事情变得更糟。
auto importantInfo1 = 0;
auto importantInfo2 = 0;
auto someDummy = 0; // This is ugly and doesn't clearly express the intent
file >> importantInfo1 >> someDummy >> importantInfo2;
Run Code Online (Sandbox Code Playgroud)
另外,在某些情况下,如果我需要在“跳过”情况下处理不同的数据类型,我将需要多个虚拟对象。
我会想象这样的事情:
file >> importantInfo1;
file.skip<int>(1);
file >> importantInfo2;
Run Code Online (Sandbox Code Playgroud)
或者甚至更好:
auto importantInfo1 = 0;
auto importantInfo2 = 0;
file >> importantInfo1 >> skip<int> >> importantInfo2;
Run Code Online (Sandbox Code Playgroud)
我想这样的解决方案也会比实际解析值并将其存储在不需要的地方更好。
使用提供的答案制定了此解决方案。与接受的答案基本相同,但不需要临时。相反,它会跳过第一个空格,然后跳过除空格之外的任何字符,直到再次到达空格为止。此解决方案可能使用 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;
}
Run Code Online (Sandbox Code Playgroud)
小智 2
我认为你的想法是使用操纵器来跳过数据是正确的方法。
跳过“琐碎”数据:
#include <sstream>
template<typename T, typename Char, typename Traits>
inline std::basic_istream<Char, Traits>& skip(std::basic_istream<Char, Traits>& stream) {
T unused;
return stream >> unused;
}
int main()
{
std::istringstream in("1 666 2 ");
int a;
int b;
in >> a >> skip<int> >> b;
std::cout << a << b << '\n';
}
Run Code Online (Sandbox Code Playgroud)
如果数据变得更加复杂并且构建/流传输变得昂贵,您必须提供专门的重载并逐个字符地解析以跳过它。