Разница между fprintf, printf и sprintf?

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

что поток его?

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

8 ответов


в C "поток" является абстракцией; с точки зрения программы это просто производитель (входной поток) или потребитель (выходной поток) байтов. Он может соответствовать файлу на диске, трубе, терминалу или другому устройству, такому как принтер или tty. The FILE type содержит информацию о потоке. Обычно вы не связываетесь с 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, в отличие от потока.


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

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

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


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

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

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

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


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

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

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

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


вы также можете делать очень полезные вещи с функцией 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)

printf

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

fprintf

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

fprintf Это связано с потоками, где as printf является утверждением, подобным fprintf но не связанные с потоками, то есть fprintf is file related


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

синтаксис sprintf:

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

здесь

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

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

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

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

printf: печать в stdout

синтаксис для printf:

printf format [argument]…

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