Стандартные библиотеки в языке С++ имеют расширенный набор средств ввода-вывода. В языке С++ предусмотрены средства сохранения типов данных при вводе-выводе. Каждая операция ввода-вывода осуществляется способом, чувствительным к типу данных. Если для какого-то типа данных должным образом была определена функция ввода-вывода, то именно она автоматически вызывается для обработки этого типа данных. Если нет соответствия между типом реальных данных и функцией обработки этого типа данных, то компилятор обнаружит ошибку. Таким образом, несоответствующие данные не могут проникнуть в систему (как может случиться в языке С, в котором есть лазейки, приводящие к возникновению неуловимых и странных ошибок). Язык С++ предоставляет возможности для ввода-вывода как на «низком», так и на «высоком» уровнях.
Ввод-вывод на низком уровне (т.е. неформатированный ввод-вывод) обычно сводится к тому, что некоторое число байтов данных просто следует переслать от устройства в память или из памяти в устройство. При такой пересылке каждый байт является самостоятельным элементом данных. Передача на низком уровне позволяет осуществлять пересылку больших по объему потоков ввода-вывода с высокой скоростью, но такая передача обычно неудобна для программиста.
Программисты предпочитают иметь дело с представлением операций ввода-вывода на высоком уровне, т.е. с форматированным вводом-выводом, при котором байты группируются в такие значащие элементы данных, как, например, целые числа, числа с плавающей запятой, символы, строки, а также данные типов, определенных пользователем. Такие ориентированные на типы возможности более удобны для большинства операций ввода-вывода, кроме обработки файлов очень большого объема.
Пользователи могут задавать ввод-вывод типов, определяемых пользователем, так же, как и стандартных типов. Такая расширяемость является самым ценным свойством языка С++.