C ++ Перегрузка оператора >> - PullRequest
0 голосов
/ 06 декабря 2009

Мне нужно перегрузить оператор извлечения потока. Мне нужно сделать это, разрешив пользователю вводить строку символов в командной строке, скажем «iamastring», а затем оператор извлекает каждый символ из строки и проверяет, является ли это пробелом, и если это не пробел хранить это в массиве символов, который затем передается объекту.

@ Chip et al. Например, вывод Я не ожидаю, что он выведет что-либо на экран. Вместо этого после того, как пользователь вводит строку и нажимает клавишу ввода, пользователю следует снова предложить ввести новый пункт меню. В текущем состоянии пользователь вводит строку, нажимает ввод, а затем отображается «ошибка чтения», и приглашение возвращается в ожидании нового ввода.

Ответы [ 3 ]

3 голосов
/ 06 декабря 2009

Это довольно забавно - твое имя похоже на мое, но перевернуто:)

Как насчет:

char buffer[buffSize+1]; // no need for dynamic allocation here
unsigned i = 0;
while(std::cin && !std::isspace(std::cin.peek()) && i < buffSize)
  buffer[i++] = std::cin.get();
buffer[i] = '\0'; // null termination can be important.
// i now contains the length btw

Это именно ваш собственный код, только немного переработанный - я удалил все ненужные вещи и т. Д., Ничего более ..

Изменить: теперь исправлено, чтобы проверить состояние потока и предотвратить переполнение стека:)

Редактировать II: изменен std :: cin.good () &&! Std :: cin.eof () на std :: cin. Кстати: почему у cin есть преобразование в void *, а не в bool?

3 голосов
/ 06 декабря 2009

Есть ли причина, по которой вы не используете std :: string и std :: getline? Вы должны дважды или даже трижды подумать, прежде чем писать свой собственный оператор извлечения - отформатированный ввод не является особенно полезной функцией C ++ (или C, если так).

1 голос
/ 06 декабря 2009

В любом случае код не работает. Он не обрабатывает ошибки ввода, которые могут быть фатальными, поскольку ваш код может войти в бесконечный цикл. Если вы инкапсулируете операции чтения потока, вы должны позаботиться о том, чтобы проверить, находится ли поток в действительном состоянии.

...