Самой большой проблемой при использовании printf и scanf является несоответствие спецификатора формата и типа аргумента, а для scanf также пропущенная операция ``&``.
С помощью перегрузки операций в C++ избавляются от формата, но в результате либо теряются некоторые возможности (пропуск вспомогательных символов, ввод заданного количества символов), либо их реализация является более сложной (ввод/вывод шестнадцатеричных чисел, выравнивание в поле заданной ширины).
Необходимые для ввода-вывода в С++ объекты и операции объявлены в следующих заголовочных файлах:
* ``<iostream>`` -- потоки ввода вывода и операции
* ``<iomanip>`` -- манипуляторы для форматированного ввода-вывода (устаревший способ)
* ``<format>`` -- форматирование для вывода (новый простой способ, аналог printf)
Для упрощения использования стандартной библиотеки С++ (STL) рекомендуется написать\
``using namespace std;``\
иначе перед каждым именем из STL нужно писать префикс ``std::`` (``std::cout``, ``std::noskipws``).
```run-cpp
#include <iostream>
#include <format>
using namespace std;
int main()
{ double a,b;
// ввод и вывод пары чисел
cin>>a>>b; // scanf("%lg%lg",&a,&b);
cout<<a<<" "<<b<<"\n"; // printf("%lg %lg\n",a,b);
cout<<format("a+b={:10.2f}\n",a+b); // printf("a+b=%10.2lf\n,a+b);
int d,m,y;
char c;
// ввод и вывод даты в формате d/m/y
cin>>d>>c>>m>>c>>y; // scanf("%d/%d/%d",&d,&m,&y);
cout<<d<<"/"<<m<<"/"<<y<<"\n"; // printf("%d/%d/%d\n",d,m,y);
cout<<format("{:02}/{:02}/{}\n",d,m,y); // printf("%02d/%02d/%d\n",d,m,y);
}
<<
10.5 1.5
12/3/2021
```