Проблемы с цин

Я использую cin двумя разными способами: в одном случае я просто использую переменную cin (перегружено)>>, а в другом я использую функцию read, которая принимает istream.

Код, который у меня есть для этого:

cin >> string6;
cout << string6; 
string7.read(cin); 
cout << string7;

Проблема, с которой я столкнулся, заключается в том, что все, что осталось в cin от строки 6, используется для строки 7 (если я читаю «Привет», а затем ^ D ^ D, чтобы обозначить конец ввода, я почти уверен ^ D считывается в строку7), поэтому я не могу прочитать пользовательский ввод с помощью string7.read(). Как решить эту проблему?

РЕДАКТИРОВАТЬ: string6/string7 являются переменными моего класса String(), а чтение является функцией-членом String.


person Jonathan Chiou    schedule 08.02.2014    source источник
comment
Может быть, вам нужно std::getline() вместо string7.read()?   -  person user3159253    schedule 08.02.2014
comment
Не могу этого сделать, я должен использовать read().   -  person Jonathan Chiou    schedule 08.02.2014
comment
read() не является членом std::string, какую строку вы используете?   -  person Gibby    schedule 08.02.2014
comment
Ну, вы понимаете, что у std::string нет стандартного метода read()?   -  person user3159253    schedule 08.02.2014
comment
Я использую свой класс String, представляющий строку в виде связанного списка. read() - это функция-член, которая у меня есть для этого. Все, что он делает, это ifstream ›› *this.   -  person Jonathan Chiou    schedule 08.02.2014
comment
@Jonathan Chiou Пожалуйста, покажите свой код класса String   -  person BlackMamba    schedule 08.02.2014
comment
Мне просто нужно сбросить cin, чтобы я мог снова читать пользовательский ввод. Если я закомментирую любой из операторов, другой будет работать, мой код класса String на самом деле не нужен.   -  person Jonathan Chiou    schedule 08.02.2014
comment
@JonathanChiou Чем read занимается внутри? Какую функцию он вызывает?   -  person 0x499602D2    schedule 08.02.2014


Ответы (2)


У меня нет вашего кода, поэтому я не могу его проверить, но это может сработать:

istream&  ignore ( streamsize n = 1, int delim = EOF );

Извлекает символы из входной последовательности и отбрасывает их.

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
person Gibby    schedule 08.02.2014

«cin >>» будет читаться до следующего символа новой строки. Вы можете использовать cin.ignore() для удаления символов. Вы также можете использовать cin.peek(), чтобы проверить, что в данный момент находится в начале потока.

So,

if( cin.peek() == '^D' )
{
    cin.ignore();
}

Замена '^D' фактическим кодом. Вы также можете просто сделать что-то вроде

while( !isalpha( cin.peek() ) )
{
    cin.ignore();
}

чтобы гарантировать, что cin начинается с альфа-символа.

person dvntehn00bz    schedule 08.02.2014