Switching from formatted to unformatted input in C

2019-03-06 07:25发布

I have an input text file. The first line has two int numbers a and b, and the second line is a string. I want to use formatted input to do file >> a >> b, and then unformatted input to get the characters of the string one by one. In between the two steps, I need to skip over the '\n' character at the end of the first line. I used

  while(file.get()<=' ' && !file.eof());  // skip all unprintable chars
  if(!file.eof()) file.unget();           // keep the eof sign once triggered

to make the input format more flexible. The user can now separate the numbers a and b from the string using an arbitrary number of empty lines '\n', tab keys '\t', and/or space keys ' ' -- the same freedom he has to separate the numbers a and b. There's even no problem reading in Linux a text file copied from Windows when every end of line now becomes "\r\n".

Is there an ifstream function that does the same thing (skip all chars <=' ' until the next printable char or EOF is reached)? The ignore function does not seem to do that.

标签: c++ istream
1条回答
小情绪 Triste *
2楼-- · 2019-03-06 08:18

Yes, there is: std::ws manipulator. It skips whitespace characters until a non-whitespace is found or end of stream is reached.. It is similar to use of whitespace character in scanf format string.

In fact, it is used by formatted input before actually starting to parse characters.

You can use it like that:

int x;
std::string str;
std::cin >> x >> std::ws;
std::getline(std::cin, str);
//...
//std::vector<int> vec;
for(auto& e: vec) {
    std::cin >> e;
}
std::getline(std::cin >> std::ws, str);
查看更多
登录 后发表回答