Он почему-то не работает после того, как я делаю "cin >> чтототам", без этого все работает, а как только сделаю "cin >> чтототам", cin.get просто не работает :( что делать ?
Куском кода давать проблематично т.к. я не умею делать переход на новую строку в этом форуме(пытался писать <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(); - так все нормально, но мне кажется как то неправильно это.
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 :)
в общем мораль простая, cin >> age оставляет конец строки
в потоке, в результате по getline тебе прилетает пустая строчка
пока чтоб работало можешь сделать что-нить вроде:
#include <iostream>
#include <iomanip>
это работает, потому как все пробельные символы пропускаются пока
не найдется не-пробел, он кладется в tmp и потом запихивается
обратно в поток.
ну или если пустая строчка то перечитывай пока непустая не придет :)
хотя по-моему был какой-то прямой способ сказать
istream чтоб пропустил пробелы перед началом считывания...
утро вечера мудренее, завтра поковыряюсь - напишу
PS. подумай про случай, когда тебе введут `21 Joe Farmer' :)
PPS. почему предпочитаешь char* использовать, когда есть string ?
Спасибо, я в общем то так и делал, только чуть-чуть по другому:
char garbage;
garbage = cin.get();
cin.get без параметров возвращает единичный символ, похоже то что мне надо, тот самый разделитель, я потому и написал, что думал про другой способ, более правильный. Про тот случай когда вводятся данные целиком подумал, спасибо. String не использую потому, что сейчас пытаюсь разобраться с поизвольным доступом к файлу, записываю туда структуру целиком, и мне нужно чтобы были четкие размеры, а string я не вообще не особо понимаю - какие у него размеры :) В общем большое спасибо, если найдешь другой способ - напиши пожалуйста.
про skipws все почти так, skipws в установленном сстоянии
обеспечивает пропуск пробельных символов при вводе(сам он их не извлекает)
перед данными при операциях вроде
cin >> age;
getline, get не пропускает пробелы перед вводом данных. отличаются
они тем, что getline забирает конец строчки из потока, а get --- нет.
char garbage=cin.get();
работает только если после age не осталось пробелов до конца строки.
я-бы не стал на это надеяться, особенно если учесть возможность
перенаправления ввода из файла...
char tmp;
cin >> tmp;
cin.putback(tmp);
работает потому, что по-умолчанию в потоке стоит флажок skipws и все
пробелы пробелы пропускаются, в tmp кладется первый не пробел из следующей
строчки(fio), он запихивается обратно в поток и первый символ --- начало
строчки. все работает, если устраивает игнорирование пробелов вначале fio.
и использовать примерно так:
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 :)