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


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

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

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

8 164

8 ответов:

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

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

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

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

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

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

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

Если stdout файл используется в качестве первого параметра в 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 Это связано с потоками, где, как printf Это оператор, похожий на fprintf но не связанные с потоками, то есть fprintf связана с файлом

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, стандартный вывод устройство.