LINUX.ORG.RU

Странно работает cin.get


0

0

Он почему-то не работает после того, как я делаю "cin >> чтототам", без этого все работает, а как только сделаю "cin >> чтототам", cin.get просто не работает :( что делать ?

anonymous

а можно подробности узнать, как именно не работает? желательно куском кода :)

anonymous
()

Куском кода давать проблематично т.к. я не умею делать переход на новую строку в этом форуме(пытался писать <br> - не получилось). Я пытаюсь делать примерно так : int age; char name[20]; Потом делаю cin >> age; Это работает и работает так как надо, а потом я делаю cin.get(name, 20); - вот это уже не работает, просто не делается приглашения ввести что-то. Похоже cin >> age; забирает все до пробела, а cin.get - подбирает все, что после него, а мне надо чтобы cin.get забирал свою, независимую от cin >> строку. Получилось сделать так, между cin >> и cin.get вставить char garbage; garbage = cin.get(); - так все нормально, но мне кажется как то неправильно это.

anonymous
()

не понял как не работает... у меня все работает:

#include <iostream>
#include <iomanip>
#include <string>

int main(void) {
int age;
char name[20];
string str;

cin >> age >> name >> str;
cout << age << endl << name << endl << str << endl;
return 0;
}

или я не понял чего именно ты хочешь?
заглотить целую строчку? тогда пользуй
istream& istream::getline(char* ptr, int len, char delim = '\n');
соответственно cin.getline(name,20);

в общем пиши, разберемся :)

PS. а по поводу переносов, есть такой listbox под окошком,
ставишь там User line breaks :)

anonymous
()

Проверка
переноса <br> проверка

anonymous
()

Перенос работает - большое спасибо. Код не работает вот так:
#include <iostream>
#include <iomanip>

void main(void) {
int age;
char fio[20];
cin >> age;
cin.getline(fio,20);
cout << age << endl << fio << endl;
}

age - он забирает, а вот fio - нет :(

anonymous
()

в общем мораль простая, cin >> age оставляет конец строки
в потоке, в результате по getline тебе прилетает пустая строчка
пока чтоб работало можешь сделать что-нить вроде:
#include <iostream>
#include <iomanip>

void main(void) {
int age;
char fio[20],tmp;
cin >> age;
cin >> tmp;
cin.putback(tmp);
cin.getline(fio,20);
cout << age << endl << fio << endl;
}

это работает, потому как все пробельные символы пропускаются пока
не найдется не-пробел, он кладется в tmp и потом запихивается
обратно в поток.
ну или если пустая строчка то перечитывай пока непустая не придет :)

хотя по-моему был какой-то прямой способ сказать
istream чтоб пропустил пробелы перед началом считывания...

утро вечера мудренее, завтра поковыряюсь - напишу

PS. подумай про случай, когда тебе введут `21 Joe Farmer' :)
PPS. почему предпочитаешь char* использовать, когда есть string ?

anonymous
()

Спасибо, я в общем то так и делал, только чуть-чуть по другому:
char garbage;
garbage = cin.get();

cin.get без параметров возвращает единичный символ, похоже то что мне надо, тот самый разделитель, я потому и написал, что думал про другой способ, более правильный. Про тот случай когда вводятся данные целиком подумал, спасибо. String не использую потому, что сейчас пытаюсь разобраться с поизвольным доступом к файлу, записываю туда структуру целиком, и мне нужно чтобы были четкие размеры, а string я не вообще не особо понимаю - какие у него размеры :) В общем большое спасибо, если найдешь другой способ - напиши пожалуйста.

anonymous
()

Структуру лучше записывать методом write, а считывать методом read. Пропускать пробелы - если я правильно помню - cin >> skipws.

justme
()

про структуры и бинарные файлы согласен с justme

про skipws все почти так, skipws в установленном сстоянии
обеспечивает пропуск пробельных символов при вводе(сам он их не извлекает)
перед данными при операциях вроде
cin >> age;
getline, get не пропускает пробелы перед вводом данных. отличаются
они тем, что getline забирает конец строчки из потока, а get --- нет.

char garbage=cin.get();
работает только если после age не осталось пробелов до конца строки.
я-бы не стал на это надеяться, особенно если учесть возможность
перенаправления ввода из файла...

char tmp;
cin >> tmp;
cin.putback(tmp);
работает потому, что по-умолчанию в потоке стоит флажок skipws и все
пробелы пробелы пропускаются, в tmp кладется первый не пробел из следующей
строчки(fio), он запихивается обратно в поток и первый символ --- начало
строчки. все работает, если устраивает игнорирование пробелов вначале fio.

лучше всего по-моему написать функцию выбирающюю пробелы:
#include <iostream>
#include <cctype>
istream& skipwhite(istream& is)
{
char c;
while(is.get(c)){
if(!isspace(c)){
is.putback(c);
break;
}
}
return is;
}
или аналог выбирающий пробелы до конца строчки включительно:
#include <iostream>
#include <cctype>
istream& skipwhite_to_eol(istream& is)
{
char c;
while(is.get(c)){
if(isspace(c)&&iscntrl(c)){
break;
}
if(!isspace(c)){
is.putback(c);
break;
}
}
return is;
}

и использовать примерно так:
char fio[20];
int age;
cin >> age;
skipwhite(cin);
cin.readline(fio,20);

или при большом желании можно сделать из нее манипулятор,
как писать пока не буду, надо будет --- напишу :)
char fio[20];
int age;
cin >> age >> skipwhite;
cin.readline(fio,20);

надеюсь на этот раз ровно то, что хотелось :)
ds.

PS. DOS'овские CR/LF это, как обычно, дополнительные грабли, но имхо
лучше с ними не связаваться, а конвертить предварительно файлы.

PPS. все равно не пойму, чем тебе больше нравится
char fio[20];
cin.getline(fio,20);
чем
string fio;
cin.getline(fio);
по-моему ничем не хуже :) а лучше,
а если структуры/бинарные данные вводить, то правильней использовать
read и write, они хоть char(0) в конец не добавляют, и читают
указанные 20 символов, а не 19, как get и getline :)

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