std::cin
является std::basic_istream
и можно манипулировать как таковой.
Обычно вы читаете поток с помощью >>
или getline
, например. Оба эти чтения «знают, когда остановиться».
Но если вы хотите заглянуть в буфер с помощью \n
s, тогда предполагается, что вы передадите поток с консоли символами новой строки и что функции, которые вы используете для чтения, не будут «съедать» строки новой строки ,
copy the buffer to a string. Но помните, что вам придется signal the EOF каким-то другим способом.
#include <iostream>
#include <string>
#include <sstream>
int main() {
std::ostringstream oss{};
oss << std::cin.rdbuf();
std::string all_chars{oss.str()};
std::cout << all_chars;
return 0;
}
На окнах, если я типа челлоВведитетчегеВведите следует Ctl + г (должно быть на новую линию для окон), то я вижу:
hello
there
^Z
hello
there
Таким образом, в этом примере, все включая переводы строк хранились в std::string
.
Но я вижу только \n
для линейных окончаний.Я думал, что Windows, должен был использовать \r
\n
для линейных окончаний
Я добавил следующее, чтобы показать отдельные символы в явном виде:
int index{};
for(auto mychar : all_chars)
std::cout << std::setw(3) << index++ << ": character number " << std::setw(5) << static_cast<int>(mychar)
<< " which is character\t"<< ((mychar == 10) ? "\\n" : std::string{}+mychar) << '\n';
Для того же входа он производит:
hello
there
^Z
hello
there
0: character number 104 which is character h
1: character number 101 which is character e
2: character number 108 which is character l
3: character number 108 which is character l
4: character number 111 which is character o
5: character number 10 which is character \n
6: character number 116 which is character t
7: character number 104 which is character h
8: character number 101 which is character e
9: character number 114 which is character r
10: character number 101 which is character e
11: character number 10 which is character \n
Итак, это показывает, что из консоли передаются только \n
s, а не \r
s, чтобы быть fou без обозначения даты Я использовал Windows 10 для этого теста, но я полагаю, что это было поведением некоторое время.
Вообще, невозможно со стандартным C++. В системах, где это имеет значение, вы иногда можете уйти с закрытием и повторным открытием 'std :: cin' в двоичном режиме, а затем использовать' read() 'для получения символов. Но это не гарантируется стандартом. – Peter
Для потоков _text_ (т. Е. Потоки файлов, не открытые с помощью 'std :: ios_base :: binary'), конечная последовательность для конкретной платформы преобразуется в' \ n' при чтении. При записи в эти потоки применяется противоположная операция. То есть, в Windows при чтении '\ r \ n' он преобразуется в' \ n'. Стандартные потоковые объекты обычно ведут себя как потоки файлов, открытые в текстовом режиме. Стандарт фактически не указывает точное поведение для стандартных объектов потока. –