Может кто - нибудь объяснить на простом английском языке о различиях между 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.