C ++ cin.get (), cin.peek (), пауза, то же самое с stdio

Это мой код, как и сейчас. Этот код исправляет ошибку в cin.get (). Я понимаю, что это не хороший код, он никогда не должен был быть, я просто тестировал некоторые простые вещи.

#include <string>
#include <iostream>
#include <stdio.h>

using namespace std;

int main(){
char c[1000];
cin.setstate(cin.eofbit);
cout << cin.good() << endl;
cout << cin.eof() <<endl;
cout << cin.get() << endl;
cin.putback('c');
cout << cin.get() << endl;
cout << "Do we ever reach this?" << endl;
while(1){
};
return 0;
}

Тем не мение. Моя проблема — cin.get (), cin.peek (), cin.ignore (), getchar () или почти любая другая функция cin или stdio, которую вы можете назвать, приостанавливает выполнение моей программы, когда поток пуст, без установки EOF бит или что-нибудь. Это раздражает меня, так как я хочу проверить, есть ли что-нибудь в потоке, чтобы я мог очистить его, так как ignore () всегда делает паузу.

Единственный метод, который я могу заставить работать — это istream :: readsome. Я загрузил это в массив символов и распечатал с помощью cout. Он печатает длинную строку символов, которые я не узнаю (каждый из них является отдельным символом).

http://gyazo.com/e3ee65cdad7ed5cc7b2ce2307ca58c90

Приведенное к целому числу, они получаются как -52, что не соответствует ни ASCII, ни Unicode.

Я компилирую с использованием Visual C ++ Express 2010.

Пожалуйста, помогите, я совершенно тупик на этом этапе. Я просто хочу прочитать chars / flush мой поток, не останавливаясь, если ничего нет. Я потратил хорошие 3 часа, пытаясь решить эту проблему. Вздох.

1

Решение

Чтобы избавиться от всех известных персонажей, вы можете использовать std::istream::ignore() в комбинации с std::streambuf::in_avail():

std::cin.ignore(std::cin.rdbuf()->in_avail());

Тем не менее, я предполагаю, что это не совсем то, что вы хотите: стандартные потоковые объекты просто читают то, что им вручает операционная система. Как правило, режим по умолчанию для ввода, подключенного к консольному окну, заключается в буферизации ввода. Сколько символов действительно передано потоку, в значительной степени не определено.

Чтобы проверить, есть ли входные данные в потоке ввода, вам нужно использовать методы, специфичные для платформы. Стандартная библиотека C ++ не обеспечивает никакой неблокирующей проверки, чтобы увидеть, поступили ли новые данные std::cin, В системе POSIX вы можете просто использовать poll() с файловым дескриптором 0 увидеть, если std::cin есть какие-либо данные. Что нужно в не POSIX системах, я не знаю.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector