Глава 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++.