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?
Jestem naprawdę zdezorientowany między tymi trzema czytając o "obsłudze plików w C".
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.
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*
)
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.
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
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)
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
- printf jest używany do wykonywania wyjścia na ekranie.
- składnia =
printf("control string ", argument );
- nie jest powiązany z wejściem/wyjściem pliku
Fprintf
- fprintf użyty do wykonania operacji zapisu w pliku wskazywanym przez uchwyt pliku.
- składnia to
fprintf (filename, "control string ", argument );
- jest on związany z wejściem/wyjściem pliku
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
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.
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