Różnica między fprintf, printf i sprintf?

Czy ktoś może wyjaśnić w prostym języku angielskim o różnicach między printf, fprintf, i sprintf z przykładami?

W jakim strumieniu to jest?

Jestem naprawdę zdezorientowany między tymi trzema czytając o "obsłudze plików w C".

Author: Michael Irigoyen, 2011-01-07

8 answers

W C "strumień" jest abstrakcją; z punktu widzenia programu jest to po prostu producent (strumień wejściowy) lub konsument (strumień wyjściowy) bajtów. Może odpowiadać plikowi na dysku, rurze, terminalu lub innemu urządzeniu, np. drukarce lub tty. Typ FILE zawiera informacje o strumieniu. Zwykle nie zadzierasz bezpośrednio z zawartością obiektu FILE, po prostu przekazujesz do niego wskaźnik do różnych procedur We / Wy.

Istnieją trzy standardowe strumienie: stdin jest wskaźnikiem do standardowego strumienia wejściowego, {[4] } jest wskaźnikiem do standardowego strumienia wyjściowego, a stderr jest wskaźnikiem do standardowego strumienia wyjściowego błędów. W sesji interaktywnej trzy z nich zazwyczaj odnoszą się do konsoli, chociaż można je przekierować do innych plików lub urządzeń: [18]}

$ myprog < inputfile.dat > output.txt 2> errors.txt

W tym przykładzie stdin wskazuje teraz na inputfile.dat, stdout wskazuje na output.txt i stderr wskazuje na errors.txt.

fprintf zapisuje sformatowany tekst do określonego strumienia wyjściowego.

printf jest odpowiednikiem zapisu fprintf(stdout, ...) i zapisuje sformatowany tekst tam, gdzie standardowy strumień wyjściowy jest aktualnie wskazywany.

sprintf zapisuje sformatowany tekst do tablicy char, w przeciwieństwie do strumienia.

 190
Author: John Bode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-04 14:49:48

printf wyjścia do standardowego strumienia wyjściowego(stdout)

fprintf przechodzi do uchwytu pliku(FILE*)

sprintf idzie do przydzielonego bufora. (char*)

 130
Author: Moo-Juice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-07 15:52:52

Printf ("format", args) jest używany do drukowania danych na standardowe wyjście, które często jest monitorem komputera.

Sprintf (char *, "format", args) jest jak printf. Zamiast wyświetlania sformatowanego ciągu na standardowym wyjściu, tj. monitorze, zapisuje sformatowane dane w łańcuchu wskazywanym przez wskaźnik znaku (pierwszy parametr). Lokalizacja ciągu znaków jest jedyną różnicą między składnią printf i sprint.

Fprintf (plik * fp, "format", args) jest jak printf ponownie. Tutaj zamiast wyświetlania danych na monitorze lub zapisywania ich w jakimś łańcuchu, sformatowane dane są zapisywane na pliku, na który wskazuje wskaźnik pliku, który jest używany jako pierwszy parametr fprintf. Wskaźnik pliku jest jedynym dodatkiem do składni printf.

Jeśli plik stdout jest używany jako pierwszy parametr w fprintf, jego działanie jest wtedy uważane za równoważne z działaniem printf.

 20
Author: Rubal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-21 22:06:18

printf(...) jest równoważne fprintf(stdout,...).

fprintf jest używany do wyjścia do strumienia.

sprintf(buffer,...) służy do formatowania łańcucha znaków do bufora.

Uwaga jest też vsprintf, vfprintf i vprintf

 19
Author: VGE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-16 15:22:25

Możesz również robić bardzo przydatne rzeczy za pomocą funkcji 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)
 2
Author: Maxim Egorushkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-07 16:12:15

Printf

  1. printf jest używany do wykonywania wyjścia na ekranie.
  2. składnia = printf("control string ", argument );
  3. nie jest powiązany z wejściem/wyjściem pliku

Fprintf

  1. fprintf użyty do wykonania operacji zapisu w pliku wskazywanym przez uchwyt pliku.
  2. składnia to fprintf (filename, "control string ", argument );
  3. jest on związany z wejściem/wyjściem pliku
 2
Author: Amit Vasava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-03 15:56:42

fprintf jest to związane ze strumieniami, gdzie jako printf jest instrukcją podobną do fprintf, ale nie związaną ze strumieniami, czyli fprintf jest związaną z plikami

 0
Author: kavamsi12,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-07 11:49:33

Sprintf: zapisuje sformatowane dane do ciągu znaków w pamięci zamiast stdout

Składnia sprintf to:

#include <stdio.h>
int sprintf (char *string, const char *format
[,item [,item]…]);

Tutaj,

String odnosi się do wskaźnika do bufora w pamięci, w którym dane mają być zapisane.

Format odnosi się do wskaźnika do ciągu znaków definiującego format.

Każdy element jest zmienną lub wyrażeniem określającym dane do zapisu.

Wartość zwracana przez sprintf jest większa lub równa zeru, jeśli operacja jest successful lub innymi słowy liczba napisanych znaków, nie licząc kończącego się znaku null jest zwracana i zwraca wartość mniejszą niż zero w przypadku wystąpienia błędu.

Printf: drukuje na stdout

Składnia printf to:

printf format [argument]…

Jedyna różnica pomiędzy sprintf() i printf() polega na tym, że sprintf() zapisuje dane do tablicy znaków, podczas gdy printf() zapisuje dane do standardowego urządzenia wyjściowego stdout.

 0
Author: Fahad Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-04 21:50:52