Игнорировать чтение значения с использованием входного потока - PullRequest
0 голосов
/ 04 декабря 2018

Есть ли способ "сбросить" значение, прочитанное с использованием потока, без чтения его в фиктивную переменную?

Например, если у меня есть файл, который содержит две строки и целое число, например, «foo.txt» выглядит так:

foo      bar      6
foofoo   barbar   8

Возможно ли сделать что-то подобное:

std::string str;
int i;
std::ifstream file("foo.txt");
file >> str >> nullptr >> i;

и имеют str = "foo" и i = 6 впоследствии?

1 Ответ

0 голосов
/ 04 декабря 2018

Существует std::basic_istream::ignore, но это в значительной степени бесполезно, потому что:

  1. Он может пропускать только один конкретный символ-разделитель, но не класс символов (например, любой пробел).
  2. Он должен вызываться несколько раз, чтобы пропустить слово.

Вы можете написать функцию ignore_word(std::istream& s):

std::istream& ignore_word(std::istream& s) {
    while(s && std::isspace(s.peek()))
        s.get();
    while(s && !std::isspace(s.peek()))
        s.get();
    return s;
}

int main() {
    std::istringstream s("foo bar 6");
    std::string foo;
    int i;
    s >> foo;
    ignore_word(s);
    s >> i;
    std::cout << foo << ' ' << i << '\n';
}
...