Может ли кто-нибудь объяснить на простом английском языке о различиях между printf
, fprintf
и sprintf
примерами?
В каком потоке он находится?
Я действительно путаюсь между тремя из них, читая о "Обработка файлов в C".
Может ли кто-нибудь объяснить на простом английском языке о различиях между printf
, fprintf
и sprintf
примерами?
В каком потоке он находится?
Я действительно путаюсь между тремя из них, читая о "Обработка файлов в C".
В 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(...)
эквивалентен fprintf(stdout,...)
.
fprintf
используется для вывода в поток.
sprintf(buffer,...)
используется для форматирования строки в буфер.
Обратите внимание, что есть также vsprintf
, vfprintf
и vprintf
printf ( "format" , args) используется для печати данных на стандартный вывод, который часто является монитором компьютера.
sprintf (char *, "format" , args) подобен printf. Вместо этого при отображении сформированной строки на стандартном выходе, то есть на мониторе, он сохраняет сформированные данные в строке, на которую указывает указатель char (самый первый параметр). Расположение строк - единственная разница между синтаксисом printf и sprint.
fprintf (FILE * fp, "format" , args), как и printf. Здесь вместо того, чтобы отображать данные на мониторе или сохранять их в некоторой строке, форматированные данные сохраняются в файле, на который указывает указатель на файл, который используется в качестве первого параметра для fprintf. Указатель файла является единственным дополнением к синтаксису printf.
Если файл stdout используется как первый параметр в fprintf, его работа затем считается эквивалентной работе printf.
Вы также можете делать очень полезные вещи с помощью функции 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
printf("control string ", argument );
fprintf
fprintf (filename, "control string ", argument );
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.