Разница между fprintf, printf и sprintf? - PullRequest
194 голосов
/ 07 января 2011

Может кто-нибудь объяснить простым языком о различиях между printf, fprintf и sprintf с примерами?

В каком потоке?

Я действительнозапутался между тремя из них, читая о "Обработка файлов в C".

Ответы [ 8 ]

212 голосов
/ 07 января 2011

В C «поток» является абстракцией;с точки зрения программы это просто производитель (входной поток) или потребитель (выходной поток) байтов.Он может соответствовать файлу на диске, каналу, вашему терминалу или другому устройству, такому как принтер или tty.Тип FILE содержит информацию о потоке.Обычно вы не связываетесь непосредственно с содержимым объекта FILE, вы просто передаете указатель на него различным процедурам ввода-вывода.

Существует три стандартных потока: stdin - указатель на стандартный поток ввода, stdout - указатель на стандартный поток вывода, а stderr - указатель на поток вывода стандартной ошибки.В интерактивном сеансе эти три обычно относятся к вашей консоли, хотя вы можете перенаправить их для указания на другие файлы или устройства:

$ myprog < inputfile.dat > output.txt 2> errors.txt

В этом примере stdin теперь указывает на inputfile.dat, stdout указывает на output.txt, а stderr указывает на errors.txt.

fprintf записывает форматированный текст в указанный вами выходной поток.

printf эквивалентно записи fprintf(stdout, ...) и записи форматированного текста туда, куда указывает текущий поток вывода.

sprintf записи форматированного текста в массив char,в отличие от потока.

139 голосов
/ 07 января 2011

printf выводит в стандартный поток вывода (stdout)

fprintf переходит к дескриптору файла (FILE*)

sprintf переходит в буфер, который вывыделены.(* 1 010 *)

27 голосов
/ 22 июня 2015

printf («формат», args) используется для печати данных на стандартный вывод, который часто является монитором компьютера.

sprintf (char *, "format", args) похоже на printf. Вместо этого при отображении форматированной строки на стандартном выходе, то есть на мониторе, он сохраняет форматированные данные в строке, на которую указывает указатель на символ (самый первый параметр). Расположение строки - единственное различие между синтаксисом printf и sprint.

fprintf (FILE * fp, "format", args) снова похож на printf. Здесь вместо отображения данных на мониторе или сохранения их в какой-либо строке отформатированные данные сохраняются в файле, на который указывает указатель файла, который используется в качестве первого параметра для fprintf. Указатель файла является единственным дополнением к синтаксису printf.

Если файл stdout используется в качестве первого параметра в fprintf, то его работа считается эквивалентной работе printf.

22 голосов
/ 07 января 2011

printf(...) эквивалентно fprintf(stdout,...).

fprintf используется для вывода в поток.

sprintf(buffer,...) используется для форматирования строки в буфер.

Обратите внимание, есть также vsprintf, vfprintf и vprintf

2 голосов
/ 27 мая 2015

Printf

  1. printf используется для вывода на экран.
  2. синтаксис = printf("control string ", argument );
  3. Не связано с вводом / выводом файла

fprintf

  1. fprintf, который использовался для выполнения операции записи в файл, указанный дескриптором FILE.
  2. Синтаксис fprintf (filename, "control string ", argument );
  3. Это связано с вводом / выводом файла
2 голосов
/ 07 января 2011

Вы также можете делать очень полезные вещи с помощью функции vsnprintf ():

$ cat test.cc
#include <exception>
#include <stdarg.h>
#include <stdio.h>

struct exception_fmt : std::exception
{
    exception_fmt(char const* fmt, ...) __attribute__ ((format(printf,2,3)));
    char const* what() const throw() { return msg_; }
    char msg_[0x800];
};

exception_fmt::exception_fmt(char const* fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    vsnprintf(msg_, sizeof msg_, fmt, ap);
    va_end(ap);
}

int main(int ac, char** av)
{
    throw exception_fmt("%s: bad number of arguments %d", *av, ac);
}

$ g++ -Wall -o test test.cc

$ ./test
terminate called after throwing an instance of 'exception_fmt'
  what():  ./test: bad number of arguments 1
Aborted (core dumped)
0 голосов
/ 05 марта 2014

sprintf: записывает отформатированные данные в символьную строку в памяти вместо stdout

Синтаксис sprintf:

#include <stdio.h>
int sprintf (char *string, const char *format
[,item [,item]…]);

Здесь

Строка ссылается на указательв буфер в памяти, куда должны быть записаны данные.

Формат - это указатель на строку символов, определяющую формат.

Каждый элемент - это переменная или выражение, определяющее данные для записи.

Значение, возвращаемое sprintf, больше или равно нулю, если операция выполнена успешно, или, другими словами, возвращается количество записанных символов, не считая завершающего нулевого символа, и возвращает значение меньше нуля, еслипроизошла ошибка.

printf: печать на стандартный вывод

Синтаксис для printf такой:

printf format [argument]…

Единственное различие между sprintf () и printf () состоит в том, что sprintf ()записывает данные в массив символов, в то время как printf () записывает данные в стандартное устройство вывода stdout.

0 голосов
/ 07 января 2014

fprintf Это связано с потоками, где printf является оператором, похожим на fprintf, но не относится к потокам, то есть fprintf относится к файлу

...