Может кто - нибудь объяснить на простом английском языке о различиях между 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 («формат», args) используется для печати данных на стандартный вывод, который часто является монитором компьютера.
sprintf (char *, "format", args) похож на printf. Вместо отображения отформатированной строки на стандартном выходе, то есть на мониторе, он сохраняет отформатированные данные в строке, на которую указывает указатель на символ (самый первый параметр). Расположение строки - единственная разница между синтаксисом printf и sprint.
fprintf (FILE * fp, "format", args) снова похож на printf. Здесь вместо отображения данных на мониторе или сохранения их в какой-либо строке отформатированные данные сохраняются в файле, на который указывает указатель файла, который используется в качестве первого параметра для fprintf. Указатель файла является единственным дополнением к синтаксису printf.
Если файл stdout используется в качестве первого параметра в fprintf, его работа считается эквивалентной работе printf.
printf(...)
эквивалентно fprintf(stdout,...)
.
fprintf
используется для вывода в поток.
sprintf(buffer,...)
используется для форматирования строки в буфер.
Примечание есть также vsprintf
, vfprintf
иvprintf
v
ароматах нестандартные я считаю
v
ароматы очень , конечно , в стандарте C.
Вы также можете делать очень полезные вещи с помощью функции 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)
vsnprintf
это нестандартная функция. Большинство реализаций, которые я видел, реализуют это или что-то подобное, но это зависит от реализации.
Printf
printf("control string ", argument );
fprintf
fprintf (filename, "control string ", argument );
sprintf: записывает отформатированные данные в символьную строку в памяти вместо стандартного вывода
Синтаксис sprintf:
#include <stdio.h>
int sprintf (char *string, const char *format
[,item [,item]…]);
Вот,
Строка ссылается на указатель на буфер в памяти, куда должны быть записаны данные.
Формат относится к указателю на строку символов, определяющую формат.
Каждый элемент представляет собой переменную или выражение, определяющее данные для записи.
Значение, возвращаемое sprintf, больше или равно нулю, если операция выполнена успешно, или, другими словами, возвращается количество записанных символов, не считая завершающий нулевой символ, и возвращает значение меньше нуля, если произошла ошибка.
printf: печать на стандартный вывод
Синтаксис для printf:
printf format [argument]…
Единственная разница между sprintf () и printf () заключается в том, что sprintf () записывает данные в массив символов, а printf () записывает данные в стандартное устройство вывода stdout.