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

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

В каком потоке он находится?

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

Ответ 1

В 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, в отличие от потока.

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

Printf

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

fprintf

  • Файл fprintf, используемый для выполнения операции записи в файле, на который указывает дескриптор FILE.
  • Синтаксис fprintf (filename, "control string ", argument );
  • Он связан с вводом/выводом файла

Ответ 7

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

Ответ 8

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

Синтаксис sprintf:

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

Здесь

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

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

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

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

printf: печатает на stdout

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

printf format [argument]…

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