c ++ 11 — библиотека ввода-вывода C ++

Я попытался погуглить это, но я получаю разные ответы в разных местах. Я хочу знать случаи, когда нужно использовать одно из следующего:

#include <stdio>
#include <cstdio>
#include <iostream>

Я не могу понять разницу, так как в моем случае все мои программы на C ++, кажется, работают, если я использую их взаимозаменяемо. При этом, похоже, iostream поддерживает поток ввода и вывода, определяя cin, cout и т. Д. Однако я могу ошибаться. Я был бы признателен за ответы / заслуживающие доверия цитаты для использования их со ссылкой на стандарты C ++. Интересно, есть ли какие-либо преимущества в производительности, связанные с использованием одного над другим?

2

Решение

Нестандартные Заголовки

  • <stdio> не определено ни в одном из стандартов, которые я знаю.

Стандартизированные заголовки для C

  • <stdio.h> это заголовок c, содержащий такие функции, как printf() а также scanf(),

Стандартизированные заголовки для C ++

  • <stdio.h> включен в стандарт c ++, но не рекомендуется.
  • <cstdio> это заголовок C ++, который включает в себя такие вещи, как printf() а также scanf(),
  • <iostream> это заголовок C ++, который включает в себя такие вещи, как std::cout, std::cerr а также std::cin,
2

Другие решения

stdio для стандартного ввода-вывода в C. Он должен иметь .h в конце. В C ++ все заголовки C были заключены в cxxxxxx заголовки (без .h). Так, <stdio.h> такой же как <cstudio>. Эти функции предлагают, как printf а также scanf, для простого ввода-вывода.

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%, поэтому поправьте меня, если я ошибаюсь.

1

нет stdio (stdio.h и cstdio). «c» и отсутствующий «.h» в названии заголовка указывают, что это версия C ++ заголовка C.

проверять cstdio а также iostream (Рекомендации)

некоторые компиляторы (включая MSVC) включают заголовки stl в другие заголовки stl, что приводит к наблюдаемому эффекту. это не портативный хотя!

если вы заинтересованы в производительности: используйте варианты C ++ и Проверь это

0