#c #std
Вопрос:
Я изучаю C и столкнулся с проблемой, связанной с использованием std::ws
в следующем коде:
#include <iostream>
#include <string>
int main()
{
std::ios_base::sync_with_stdio(false);
std::string s1 {};
std::string s2 {};
std::cout << "Enter s1: ";
std::getline(std::cin >> std::ws, s1);
std::cout << "Enter s2: ";
std::getline(std::cin, s2);
std::cout << "s1: " << s1 << 'n';
std::cout << "s2: " << s2 << 'n';
return 0;
}
Как есть, код запрашивает ввод s1
до "Enter s1: "
того, как на экране появится приглашение. Удаление std::ws
позволяет распечатать приглашение. В качестве альтернативы удаление std::ios_base::sync_with_stdio(false)
также приводит к ожидаемому поведению, с или без std::ws
.
Мне кажется, что между этими двумя функциями происходит какое-то взаимодействие, но я не уверен, почему это так. Я не использовал никаких функций ввода-вывода C, поэтому я не понимаю, почему отмена синхронизации потоков может вызвать проблему. Может кто-нибудь объяснить?
Комментарии:
1.
produces the expected behaviour
Каково ожидаемое поведение? И когда — с или безstd::ws
и с или безsync_with_stdio
?2.Может быть, это «…Если синхронизация отключена, стандартным потокам C разрешается буферизировать свои операции ввода-вывода независимо…» en.cppreference.com/w/cpp/io/ios_base/sync_with_stdio ie
std::cout << "Enter s1: ";
все еще находится в выходном буфере и не был сброшен на консоль.3. @KamilCuk Я имел в виду, что печать выполняется в правильном порядке.
4. По умолчанию любое чтение
std::cin
должно бытьstd::cout
сначала сброшено. Так что не должно иметь значения,std::ws
используется он или нет. en.cppreference.com/w/cpp/io/cout : » После инициализации std::cout привязывается () к std::cin, а std::wcout привязывается () к std::wcin, что означает, что любая операция ввода в std::cin выполняет std::cout. flush() (через конструктор std::basic_istream::sentry) . »5. @RemyLebeau Что-то, кажется, останавливает это поведение здесь, отсюда и вопрос.