Библиотека ввода-вывода 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++ и отметьте это

Другие вопросы по тегам