Може хто - небудь пояснити на простому англійською мовою про відмінності між 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, стандартний пристрій виводу.