Файлы. Общая концепция организации ввода-вывода данных в С++. Средства класса ios, обеспечивающие точную настройку вывода, страница 6

ввод символа (даже единственного) заканчивается нажатием клавиши <enter>; при вводе символов игнорируются пробельные символы, поэтому последовательность символов «qwe» можно задать разными способами (перемежая пробелами или нажатием <enter>); манипулятор noskipws позволяет не пропускать пробелы (cin >> noskipws >> c1 >> c2 >>c3;); ввод символа реализуется также операторами: ch=cin.get(); cin.get(ch); cin.read(&ch,1); хотя символьные типы могут использоваться в арифметических выражениях,  ввести целое значение в символьную переменную нельзя (даже при наборе цифры, в символьную переменную всегда попадает код цифровой клавиши);

при вводе строки в буфер входного потока заносится вся введенная информация с завершающими символами (\r\n), формируемыми при нажатии клавиши <enter>; при каждой операции «извлечение»  – до ближайшего пробела; вместо «пробела» заносится ‘\0’;

для ввода строк с пробелами в символьный массив  используются методы cin.get(), cin.getline(); метод cin.ignore() извлекает символы из потока, ничего не занося в переменные и имеет два параметра (количество удаляемых символов, по умолчанию – 1, символ-ограничитель, который тоже удаляется из потока, по умолчанию – конец файла);

при выводе:

целые числа выводятся в десятичной системе счисления; шестнадцатеричная константа 0xFFFF на экране будет показана как десятичное число 65535;

для дробного числа (независимо от типа float/double) выводится только 6 значащих  цифр (например, число 7.123456789 выводится как 7.12346, а число 1234567.15 – как 1.23456е+006;

указатели по умолчанию выводятся в шестнадцатеричной системе счисления, независимо от типа; исключение составляет указатель на символьную константу: по умолчанию выводится не указатель, а строка символов, на которую он указывает, поэтому для вывода указателя необходимо преобразование типа к типу void * (char *s=”aaaaa\n”; cout << s << “  “ << static_cast<void *>(s) << ‘\n’;);

значения типа bool выводятся как целые (1–true, 0–false); возможен вывод true и false (вместо 1 и 0) при установке флага форматирования boolalpha  (например, cout.setf(ios::boolalpha); или cout.flags(ios::boolalpha); правда, последний способ предварительно сбрасывает все остальные флаги);

значения перечисляемого типа по умолчанию выводятся как целые;

символьные переменные по умолчанию выводятся как символы; чтобы вывести символьную переменную как число, необходимо задать явное преобразование типа (char n=-100; cout << int(n) << ‘\n’; одиночный символ можно вывести методом put() (char ch = ‘a’; cout.put(ch);) или методом write() (char ch =’a’; cout.write(&ch, 1);

при выводе строки из памяти в выходной поток переносятся все символы до ‘\0’; Операция оператор <<  работает и с символьными массивами и со строками типа string (string s3 = “aaaaa\n”; cout << s3;); вывести строку (кроме переменных типа string) можно и методом write() (char *s1=”bbbbb”; cout.write(s1, strlen(s1));

при выводе выражений необходимо учитывать приоритет операций; оператор << изначально является операцией сдвига влево и имеет свой приоритет (например, cout << d = f << ‘\n’; интерпретируется как (cout << d) = (f << ‘\n’); и вызовет ошибку трансляции; исправление: cout << (d=f) << ‘\n’;)

Проанализируйте примеры ввода-вывода переменных разных типов:

операторы

int i;

cin >> i;

cout <<i <<endl;

char *s;

s=new char[40];

cin >> s;

cout<<s  <<endl;

char c, c1, c2;

cin >>с >> c1 >> c2;

cout<<с <<c1<<c2 <<endl;

int i; char *s; 

s=new char[40];

cin >> i >> s;

cout << i << “  “<<s                              << endl;

ввод результат ввод результат ввод результат ввод результат

qwert123

0

qwert     123

0

123qwert

123

123    qwert

123

qwert123

qwert123

1  2  3<enter>

123

1<enter>2<enter>3<enter>

123

1   23  4<enter>

123

123qwert<enter>

123   qwert

123      qwert<enter>

123   qwert