Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: cin, cout и буферизация потоков (проблема)  (Прочитано 2166 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн yura3d

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Доброй ночи, ребята. Столкнулся с проблемой. Не могу понять, почему cin.getline() начинает выполняться раньше, чем предыдущий cout напечатает свою строку. Манипулятор std::flush для сброса буфера присутствует. Имеется весьма простой пример:
#include <iostream>

int main()
{
    size_t n;
    char buf[100];
    
    std::cout << "Input buffer size: " << std::flush;
    std::cin >> n >> std::ws;
    
    std::cout << "Enter word: " << std::flush;
    std::cin.getline(buf, n - 1);
}
После компиляции g++ и запуска получаем:
Input buffer size: 100
my_word
Enter word:
Хотя строка Enter word должна печататься до запуска cin.getline(). В чём может быть проблема? Прошу прощения, если уже обсуждалось, ткните носом, пожалуйста. Поиск по форуму ничего не дал

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: cin, cout и буферизация потоков (проблема)
« Ответ #1 : 13 Октября 2010, 01:35:56 »
Убери std::ws и воспользуйся std::cin.ignore(1000,'\n'); перед std::cin.getline();

Оффлайн yura3d

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Re: cin, cout и буферизация потоков (проблема)
« Ответ #2 : 13 Октября 2010, 02:00:07 »
Убери std::ws и воспользуйся std::cin.ignore(1000,'
'); перед std::cin.getline();

Mam(O)n, благодарю!

Пользователь решил продолжить мысль 13 Октября 2010, 02:21:57:
Хотел бы уточнить ещё один нюанс. Как узнать, сколько символов находится на данный момент во входном буфере? Это могло бы быть полезно, чтобы знать, к скольки именно символам применять ignore(). Нашёл такой вариант:
std::cin.rdbuf()->in_avail()Но у меня оно почему-то всегда 0 возвращает. Вот пример использования этого фрагмента:
int main()
{
    size_t n;
    char buf[100];
   
    std::cout << "Input buffer size: " << std::flush;
    std::cin >> n;
   
    std::cout << "Enter word: " << std::flush;
    std::cout << std::cin.rdbuf()->in_avail() << std::flush;
    std::cin.ignore(1000, '\n');
    std::cin.getline(buf, n - 1);
}
« Последнее редактирование: 13 Октября 2010, 02:21:57 от yura3d »

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: cin, cout и буферизация потоков (проблема)
« Ответ #3 : 13 Октября 2010, 03:16:23 »
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24206
std::ios::sync_with_stdio(false);

 

Страница сгенерирована за 0.018 секунд. Запросов: 21.