Поэкспериментируйте с ними, написав пример кода. Это очень простой способ четко понять разницу между ними.
Наваз
14
Предпочитайте snprintf () sprintf (), чтобы избежать глупых переполнений буфера.
Максим Егорушкин
3
Предпочитайте потоки или средства форматирования Boost, чтобы избежать глупых переполнений буфера и неприятных ошибок, связанных с отсутствием безопасности типов
Джон Диблинг,
7
@ Максим, пока вы поднимаете действительную точку, я буду уверена в том, что мои буферы не будут переполнены и разнесут мое приложение на части. Я бы только посмотрел на эти функции, если бы было установлено, что потоковые / повышающие форматеры вызывают заметные узкие места. :)
Му-сок
1
@ Максим: Дело в том, что нет необходимости. Мой код не является узким местом. 5 м / с - это количество сообщений, которые отправляет обмен, а не то, сколько мы способны обработать. Так почему преждевременно оптимизировать?
Джон Диблинг
Ответы:
239
В C «поток» является абстракцией; с точки зрения программы это просто производитель (входной поток) или потребитель (выходной поток) байтов. Он может соответствовать файлу на диске, каналу, вашему терминалу или другому устройству, например, принтеру или tty. FILEТипа содержит информацию о потоке. Обычно вы не связываетесь с FILEсодержимым объекта напрямую, вы просто передаете указатель на него различным процедурам ввода / вывода.
Существует три стандартных потока: stdinуказатель на стандартный поток ввода, stdoutуказатель на стандартный поток вывода и stderrуказатель на стандартный поток вывода ошибок. В интерактивном сеансе эти три обычно относятся к вашей консоли, хотя вы можете перенаправить их, чтобы указать на другие файлы или устройства:
«это просто производитель (входной поток) или потребитель (выходной поток) байтов». Это назад? Разве продюсер не будет создавать (выводить) что-то? Запрашиваемая, потому что я искренне не знаю.
Дейв Войлес
6
@DaveVoyles: это с точки зрения вашей программы. Входной поток производит байты для вашей программы для чтения; выходной поток потребляет байты, полученные из вашей программы.
Джон Боде
153
printfвыводит на стандартный поток вывода ( stdout)
fprintfидет к дескриптору файла ( FILE*)
sprintfидет в буфер, который вы выделили. ( char*)
printf («формат», args) используется для печати данных на стандартный вывод, который часто является монитором компьютера.
sprintf (char *, "format", args) похож на printf. Вместо отображения отформатированной строки на стандартном выходе, то есть на мониторе, он сохраняет отформатированные данные в строке, на которую указывает указатель на символ (самый первый параметр). Расположение строки - единственная разница между синтаксисом printf и sprint.
fprintf (FILE * fp, "format", args) снова похож на printf. Здесь вместо отображения данных на мониторе или сохранения их в какой-либо строке отформатированные данные сохраняются в файле, на который указывает указатель файла, который используется в качестве первого параметра для fprintf. Указатель файла является единственным дополнением к синтаксису printf.
Если файл stdout используется в качестве первого параметра в fprintf, его работа считается эквивалентной работе printf.
+1 действительно полезно, но учтите, что vsnprintfэто нестандартная функция. Большинство реализаций, которые я видел, реализуют это или что-то подобное, но это зависит от реализации.
Джон Диблинг
1
Выше @larsmans упоминает, что на самом деле это часть стандарта C, так что я возвращаюсь назад
Джон Диблинг,
2
Какое это имеет отношение к C?
один
2
Printf
printf используется для вывода на экран.
синтаксис = printf("control string ", argument );
Это не связано с Файлом ввода / вывода
fprintf
Fprintf, который он использовал для выполнения операции записи в файл, указанный дескриптором FILE.
Строка ссылается на указатель на буфер в памяти, куда должны быть записаны данные.
Формат относится к указателю на строку символов, определяющую формат.
Каждый элемент представляет собой переменную или выражение, определяющее данные для записи.
Значение, возвращаемое sprintf, больше или равно нулю, если операция выполнена успешно, или, другими словами, возвращается количество записанных символов, не считая завершающий нулевой символ, и возвращает значение меньше нуля, если произошла ошибка.
printf: печать на стандартный вывод
Синтаксис для printf:
printf format [argument]…
Единственная разница между sprintf () и printf () заключается в том, что sprintf () записывает данные в массив символов, а printf () записывает данные в стандартное устройство вывода stdout.
Ответы:
В C «поток» является абстракцией; с точки зрения программы это просто производитель (входной поток) или потребитель (выходной поток) байтов. Он может соответствовать файлу на диске, каналу, вашему терминалу или другому устройству, например, принтеру или tty.
FILE
Типа содержит информацию о потоке. Обычно вы не связываетесь сFILE
содержимым объекта напрямую, вы просто передаете указатель на него различным процедурам ввода / вывода.Существует три стандартных потока:
stdin
указатель на стандартный поток ввода,stdout
указатель на стандартный поток вывода иstderr
указатель на стандартный поток вывода ошибок. В интерактивном сеансе эти три обычно относятся к вашей консоли, хотя вы можете перенаправить их, чтобы указать на другие файлы или устройства:В этом примере
stdin
теперь указывает наinputfile.dat
,stdout
указывает наoutput.txt
иstderr
указывает наerrors.txt
.fprintf
записывает форматированный текст в указанный вами поток вывода.printf
эквивалентно записиfprintf(stdout, ...)
и записи форматированного текста туда, куда в данный момент указывает стандартный поток вывода.sprintf
записывает форматированный текст в массивchar
, а не в поток.источник
printf
выводит на стандартный поток вывода (stdout
)fprintf
идет к дескриптору файла (FILE*
)sprintf
идет в буфер, который вы выделили. (char*
)источник
printf («формат», args) используется для печати данных на стандартный вывод, который часто является монитором компьютера.
sprintf (char *, "format", args) похож на printf. Вместо отображения отформатированной строки на стандартном выходе, то есть на мониторе, он сохраняет отформатированные данные в строке, на которую указывает указатель на символ (самый первый параметр). Расположение строки - единственная разница между синтаксисом printf и sprint.
fprintf (FILE * fp, "format", args) снова похож на printf. Здесь вместо отображения данных на мониторе или сохранения их в какой-либо строке отформатированные данные сохраняются в файле, на который указывает указатель файла, который используется в качестве первого параметра для fprintf. Указатель файла является единственным дополнением к синтаксису printf.
Если файл stdout используется в качестве первого параметра в fprintf, его работа считается эквивалентной работе printf.
источник
printf(...)
эквивалентноfprintf(stdout,...)
.fprintf
используется для вывода в поток.sprintf(buffer,...)
используется для форматирования строки в буфер.Примечание есть также
vsprintf
,vfprintf
иvprintf
источник
v
ароматах нестандартные я считаюv
ароматы очень , конечно , в стандарте C.Вы также можете делать очень полезные вещи с помощью функции vsnprintf ():
источник
vsnprintf
это нестандартная функция. Большинство реализаций, которые я видел, реализуют это или что-то подобное, но это зависит от реализации.Printf
printf("control string ", argument );
fprintf
fprintf (filename, "control string ", argument );
источник
fprintf
Это связано с потоками, где asprintf
является оператором, похожим,fprintf
но не связанным с потоками, то естьfprintf
связанным с файломисточник
sprintf: записывает отформатированные данные в символьную строку в памяти вместо стандартного вывода
Синтаксис sprintf:
Вот,
Строка ссылается на указатель на буфер в памяти, куда должны быть записаны данные.
Формат относится к указателю на строку символов, определяющую формат.
Каждый элемент представляет собой переменную или выражение, определяющее данные для записи.
Значение, возвращаемое sprintf, больше или равно нулю, если операция выполнена успешно, или, другими словами, возвращается количество записанных символов, не считая завершающий нулевой символ, и возвращает значение меньше нуля, если произошла ошибка.
printf: печать на стандартный вывод
Синтаксис для printf:
Единственная разница между sprintf () и printf () заключается в том, что sprintf () записывает данные в массив символов, а printf () записывает данные в стандартное устройство вывода stdout.
источник