Происходит следующее: если basic_iostream::getline()
достигает предела читаемых символов (аргумент streamsize
минус 1), он прекращает чтение, а затем помещает нулевой символ после данных, которые он уже прочитал.Он также устанавливает failbit
в потоке.
Таким образом, предполагая, что поток готов к чтению "123456789"
, при вызове cin.get(&c[0],5)
массив получит {'1','2','3','4','\0'}
, помещенный в элементы 0
через4
.И failbit
устанавливается в потоке.
Теперь, когда вы вызываете cin.get(&c[2],4)
, в потоке устанавливается failbit
, поэтому ничего не читается.Вызов getline()
ничего не делает, только помещает завершающий ноль в массив по индексу 2
(даже если из потока ничего не читается, getline()
поместит нулевой символ - даже если не-чтение происходит из-заfailbit
).Таким образом, массив теперь выглядит следующим образом:
{'1','2','\0','4','\0'}
В документации, на которую вы ссылаетесь, упоминается это:
Если функция прекращает чтение из-за достижения этого размера, устанавливается внутренний флаг failbit..
Но getline()
многое делает, поэтому пропустить эту деталь легко.