cin.getline устанавливает начало строки в '\ 0' - PullRequest
2 голосов
/ 21 марта 2012

Я запускаю этот фрагмент кода на Visual C ++ 2010

char c[10];
cin.get(&c[0],5);
cin.get(&c[2],4);
cout << c << endl;

, и если я передаю "123456789" в cin, предложение cout выведет "12567", что является результатом Iожидается.

Но если я напишу:

char c[10];
cin.getline(&c[0],5);
cin.getline(&c[2],4);
cout<< c <<endl;

и передам ту же строку, он покажет мне только "12", где c == {'1', '2','\ 0', '4', '\ 0'}

Согласно документации , разница между cin.get и cin.getline заключается в том, что cin.get не отбрасываетсимвол delim, как это делает cin.getline, поэтому я не знаю, почему это происходит.Кто-нибудь может дать мне подсказку?

1 Ответ

4 голосов
/ 21 марта 2012

Происходит следующее: если basic_iostream::getline() достигает предела читаемых символов (аргумент streamsize минус 1), он прекращает чтение, а затем помещает нулевой символ после данных, которые он уже прочитал.Он также устанавливает failbit в потоке.

Таким образом, предполагая, что поток готов к чтению "123456789", при вызове cin.get(&c[0],5) массив получит {'1','2','3','4','\0'}, помещенный в элементы 0 через4failbit устанавливается в потоке.

Теперь, когда вы вызываете cin.get(&c[2],4), в потоке устанавливается failbit, поэтому ничего не читается.Вызов getline() ничего не делает, только помещает завершающий ноль в массив по индексу 2 (даже если из потока ничего не читается, getline() поместит нулевой символ - даже если не-чтение происходит из-заfailbit).Таким образом, массив теперь выглядит следующим образом:

{'1','2','\0','4','\0'}

В документации, на которую вы ссылаетесь, упоминается это:

Если функция прекращает чтение из-за достижения этого размера, устанавливается внутренний флаг failbit..

Но getline() многое делает, поэтому пропустить эту деталь легко.

...