Почему cin.get(char *, int, char t) и cin.getline(char *, int, char t)?

В документации сказано, что cin.get(...) оставит символ завершения (параметр t) в буфере! Мне интересно, как это может быть полезно по сравнению с getline(...), который отбрасывает символ завершения... Кстати, предположим, у меня есть char buf[256], как я могу сбросить этот buf в cout?


person Rn2dy    schedule 16.01.2011    source источник
comment
Пожалуйста, отредактируйте заголовок вопроса: вы уже ответили, в чем разница!   -  person Oliver Charlesworth    schedule 16.01.2011
comment
Пожалуйста, не помещайте второй, несвязанный вопрос в тот же пост.   -  person Fred Foo    schedule 16.01.2011


Ответы (1)


Для строк завершающий символ новой строки считается частью строки, и обычно вы хотите удалить его при чтении строки. Соглашение определило, что результирующая строка, содержащая строку not, тем не менее, содержит эту новую строку, поэтому getline отбрасывает ее, а не сохраняет. (Другие языки/библиотеки не принимают последнее решение.)

Для вещей, отличных от строк, разделитель не может считаться частью извлекаемого поля, поэтому вы хотите, чтобы он был оставлен и позже прочитан.

предположим, у меня есть char buf[256], как мне сбросить этот buf в cout?

Если это C-строка (оканчивающаяся символом \0), то cout ‹‹ buf;. В противном случае вы можете cout.write его как неформатированную последовательность байтов.

person Fred Nurk    schedule 16.01.2011
comment
Я опубликовал, но затем удалил очень похожий ответ, потому что не мог придумать ему применение ... у вас есть пример? - person Fred Foo; 16.01.2011
comment
@larsmans: Подумайте, реализовывали ли вы программу tee. - person Oliver Charlesworth; 16.01.2011
comment
Я бы реализовал tee как char путем char копирования, полагаясь на буферизацию iostream или с буферами фиксированного размера... - person Fred Foo; 16.01.2011