Библиотека ввода-вывода C++
Я пытался погуглить это, но я получаю разные ответы в разных местах. Я хочу знать случаи, когда нужно использовать одно из следующего:
#include <stdio>
#include <cstdio>
#include <iostream>
Я не могу понять разницу, так как в моем случае все мои программы на C++, кажется, работают, если я использую их взаимозаменяемо. При этом, похоже, iostream поддерживает поток ввода и вывода, определяя cin, cout и т. Д. Однако я могу ошибаться. Я был бы признателен за ответы / заслуживающие доверия цитаты для использования их со ссылкой на стандарты C++. Интересно, есть ли какие-либо преимущества в производительности, связанные с использованием одного над другим?
3 ответа
Нестандартные Заголовки
<stdio>
не определено ни в одном из стандартов, которые я знаю.
Стандартизированные заголовки для C
<stdio.h>
это заголовок c, содержащий такие функции, какprintf()
а такжеscanf()
,
Стандартизированные заголовки для C++
<stdio.h>
включен в стандарт C++, но не рекомендуется.<cstdio>
это заголовок C++, который включает в себя такие вещи, какprintf()
а такжеscanf()
,<iostream>
это заголовок C++, который включает в себя такие вещи, какstd::cout
,std::cerr
а такжеstd::cin
,
stdio
для стандартного ввода-вывода в C. Он должен иметь .h
в конце. В C++ все заголовки C были заключены в cxxxxxx
заголовки (без .h
). Так, <stdio.h>
такой же как <cstudio>
, Эти функции предлагают, как printf
а также scanf
, для простого IO.
iostream
с другой стороны, библиотека ввода-вывода для C++, и предлагает такие потоки, как cin
а также cout
, как вы упомянули.
В зависимости от вашего приложения вы можете использовать их взаимозаменяемо в течение большей части времени. Синтаксис будет другим, очевидно.
Форматирование текста может быть проще с помощью функций C. Например:
printf("item %04d has a value of %+.6e\n", index, value);
легче написать чем (нужно <iomanip>
в дополнение к <iostream>
):
std::cout << "item " << std::setw(4) << std::setfill('0') << index
<< "has a value of " << std::setprecision(6) << value << "\n";
Тем не менее, вы должны быть более осторожными при использовании первого. Например, следующая строка не приведет к ошибке компиляции (но, как уже упоминалось, вы можете получить предупреждения при компиляции), но вызовет проблемы во время выполнения:
printf("I wonder what will happen? %d\n");
Я не думаю, что есть большая разница в их производительности, так как большая часть "волшебства" потока происходит во время компиляции, и они должны давать схожие результаты. Я не уверен на 100%, поэтому поправьте меня, если я ошибаюсь.
Нет stdio (stdio.h и cstdio). "c" и отсутствующий ".h" в названии заголовка указывают, что это версия C++ заголовка C.
проверьте cstdio и iostream (ссылки)
некоторые компиляторы (включая MSVC) включают заголовки stl в другие заголовки stl, что приводит к наблюдаемому эффекту. это не портативный хотя!
если вы обеспокоены производительностью: используйте варианты C++ и отметьте это