Глава 13. Обзор потоков ввода-вывода___________________________305

Теперь посмотрим, что случится, когда мы захотим напечатать, например, целое число. Вот версия С:

int num = 10;

printf("%d", num); //'Новый символ формата: %d

А вот эквивалент C++:

int num = 10;

cout « num; // Такой же синтаксис, как и для char*

Заметьте, чтобы пользоваться функцией С, необходимо знать все спецификаторы формата, а стиль C++ не только этого не требует, но и не требует вообще никакого нового синтаксиса. Форматированный вывод функцией printf — это почти что вид искусства, хотя, казалось бы, нелепо изощряться в столь обыденном деле, как ввод и вывод. Версия C++ явно проще.

А как насчет ввода? С ним проблем еще больше. Допустим, вы хотите ввести с клавиатуры целое число. В C++ есть удобная операция ввода, работающая с данными любых типов, а в С для ввода опять нужно возиться с списками переменной длины и спецификаторами формата. И даже хуже.

Вот пример ввода по версии C++:

int num = 10;

cin » num; // Чтение целого числа из устройства ввода

Вы можете подумать, что ввод в стиле С будет выглядеть аналогично выводу:

int num;

scanf("%d", num); // Ошибка!

Последний оператор приводит к ошибке. Вы должны использовать операцию получения адреса (&), в противном случае ваша программа, скорее всего, аварийно завершится с диагнозом General Protection Failure (GPF, Общее нарушение защиты). В действительности код должен быть таким:

int num;

scant("%d", &num); // Вот так! И не забывайте &

Не надо упрекать за это С. Этот язык сыграл огромную роль в развитии искусства программирования и до сих пор еще применяется весьма широко, однако времена диктуют необходимость улучшений. Тем не менее потратить немного времени на изучение printf и scanf все-таки небесполезно.

Наконец, в С для чтения файлов и записи в них надо изучать, какой-то новый синтаксис и новые функции. Что же касается файловых потоков, то здесь работает тот же самый синтаксис — операции « для вывода и » для ввода, немного дальше вы это увидите.

Тем более любопытно, что несмотря на вышеизложенное именно с помощью функций С были изначально реализованы потоковые классы C++.