Може хто - небудь пояснити на простому англійською мовою про відмінності між printf
, fprintf
і sprintf
з прикладами?
У якому потоці він знаходиться?
Я дуже заплутався між трьома з них, читаючи про "Обробку файлів на С".
Може хто - небудь пояснити на простому англійською мовою про відмінності між printf
, fprintf
і sprintf
з прикладами?
У якому потоці він знаходиться?
Я дуже заплутався між трьома з них, читаючи про "Обробку файлів на С".
Відповіді:
У С "потік" - це абстракція; з точки зору програми, це просто виробник (вхідний потік) або споживач (вихідний потік) байтів. Це може відповідати файлу на диску, трубі, терміналу або іншому пристрою, наприклад принтеру або 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 ("формат", аргументи) використовується для друку даних на стандартний вихід, який часто є монітором комп'ютера.
sprintf (char *, "format", args) - це як printf. Замість того, щоб відображати відформатований рядок на стандартному виході, тобто на моніторі, він зберігає відформатовані дані у рядку, на який вказує покажчик char (найперший параметр). Розташування рядка є єдиною різницею між синтаксисом printf та спринту.
fprintf (FILE * fp, "формат", аргументи) знову як 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: записує відформатовані дані в символьну рядок в пам'ять замість 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, стандартний пристрій виводу.