LINUX.ORG.RU

Баг cin в mingw. Как бороться?

 ,


0

1

Наваял несложную консольную прогу. Пока ваял всё было ок. Решил потестить на винде. Внезапно, глючит! По всей видимости, виноват баг реализации cin в mingw 4.7.0.

Вот минимальный код, на котором проявляется баг:


#include <iostream>
#include <string>
using namespace std;

int main(void)
{
string x;
cin>>x;
return 0;
}

Суть бага: если ввести несколько букв, затем ctrl+Z, затем опять буквы, затем Enter, то ввод начнётся заново на следующей строчке

★★★★★
Ответ на: комментарий от next_time

А я чего? Вот могу показать такое

C:\>copy con:
11111^Z2222
11111        1 file(s) copied.

Т.е. перевод строки после ^Z игнорируется. Вот его и не видит cin

vromanov ★★★
()
Ответ на: комментарий от next_time

так бороться-то с этим как?

С чем именно?

Если ты пайпишь что-то в свою программу, код из ОП будет нормально работать. Если тебе нужно вводить текст руками из cmd, то EOF это Ctrl+Z (F6) с новой строки. Можешь читать текст посимвольно функцией _getch например

anonymous
()
Ответ на: комментарий от anonymous

Можешь читать текст посимвольно функцией _getch

платформозависимо. не катит.

Если тебе нужно вводить текст руками из cmd

да

то EOF это Ctrl+Z (F6) с новой строки

мне нужно, чтобы оно перестало глючить всего-навсего. пускай будет с новой строки, пускай в конце, пускай вообще не работает, мне всё равно. лишь бы не работало так, как сейчас.

next_time ★★★★★
() автор топика
Ответ на: комментарий от next_time

платформозависимо

getch() есть и в ncurses

мне нужно, чтобы оно перестало глючить всего-навсего

Так оно же работает? Набираешь текст, жмешь энтер, Ctrl+Z, еще раз энтер и все, в приложении EOF. Просто набирать текст в голом cmd это не очень обычный кейс, наверное это место никто и не смотрит.

Посмотри на readline или какой-то аналог (в википедии пишут что для винды есть какой-то WinEditLine: http://mingweditline.sourceforge.net/ ), наверное пользователям как-то попроще будет

anonymous
()
Ответ на: комментарий от anonymous

getch() есть и в ncurses

не хотелось бы тащить целую ncurses ради только замены cin>>, но видимо, придётся

Так оно же работает? Набираешь текст, жмешь энтер, Ctrl+Z, еще раз энтер и все, в приложении EOF

мне, повторюсь, от EOF ни горячо ни холодно, мне нужно чтобы введённый текст перестал разваливаться

next_time ★★★★★
() автор топика
Ответ на: комментарий от next_time

не хотелось бы тащить целую ncurses

Сейчас печатать в stdin как-то не очень принято, все равно придется что-то с этим делать. Если тебе нужно получать от пользователя уникальные тексты, то лучше, наверное, вызвать внешний текстовый редактор. Если нужно что-то похожее на шелл - история, редактирование, автокомплит, вот это все - лучше посмотри на readline или подобные библиотеки

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.