Czy ktoś może wyjaśnić prostym językiem o różnicach między printf
, fprintf
oraz sprintf
z przykładami?
W jakim to jest strumieniu?
Jestem bardzo zdezorientowany między tymi trzema, czytając o „Obsługa plików w C”.
Czy ktoś może wyjaśnić prostym językiem o różnicach między printf
, fprintf
oraz sprintf
z przykładami?
W jakim to jest strumieniu?
Jestem bardzo zdezorientowany między tymi trzema, czytając o „Obsługa plików w C”.
Odpowiedzi:
W C „strumień” jest abstrakcją; z perspektywy programu jest to po prostu producent (strumień wejściowy) lub konsument (strumień wyjściowy) bajtów. Może odpowiadać plikowi na dysku, potoku, terminalowi lub innemu urządzeniu, np. Drukarce lub tty. FILE
Typu zawiera informacje o strumieniu. Zwykle nie zadzierasz FILE
bezpośrednio z treścią obiektu, po prostu przekazujesz do niego wskaźnik do różnych procedur we / wy.
Istnieją trzy standardowe strumienie: stdin
wskaźnik do standardowego strumienia wejściowego, stdout
wskaźnik do standardowego strumienia wyjściowego i stderr
wskaźnik do standardowego strumienia wyjściowego błędu. W sesji interaktywnej trzy zazwyczaj odnoszą się do konsoli, chociaż można je przekierować, aby wskazać inne pliki lub urządzenia:
$ myprog < inputfile.dat > output.txt 2> errors.txt
W tym przykładzie stdin
teraz wskazuje na inputfile.dat
, stdout
wskazuje na output.txt
i stderr
wskazuje na errors.txt
.
fprintf
zapisuje sformatowany tekst w określonym strumieniu wyjściowym.
printf
odpowiada zapisywaniu fprintf(stdout, ...)
i zapisywaniu sformatowanego tekstu wszędzie tam, gdzie obecnie wskazuje standardowy strumień wyjściowy.
sprintf
zapisuje sformatowany tekst w tablicy char
, w przeciwieństwie do strumienia.
printf („format”, args) służy do drukowania danych na standardowym wyjściu, którym często jest monitor komputera.
sprintf (char *, „format”, args) jest jak printf. Zamiast wyświetlać sformatowany ciąg znaków na standardowym wyjściu, tj. Na monitorze, przechowuje sformatowane dane w ciągu wskazanym przez wskaźnik char (pierwszy parametr). Lokalizacja ciągu jest jedyną różnicą między składnią printf a sprintem.
fprintf (PLIK * fp, „format”, argumenty) znów przypomina printf. Tutaj zamiast wyświetlać dane na monitorze lub zapisywać je w jakimś ciągu, sformatowane dane są zapisywane w pliku wskazywanym przez 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 następnie uważane za równoważne działaniu printf.
printf(...)
jest równoważne z fprintf(stdout,...)
.
fprintf
służy do wyświetlania strumienia.
sprintf(buffer,...)
służy do formatowania ciągu do bufora.
Uwaga jest również vsprintf
, vfprintf
ivprintf
v
smaki są niestandardowe wierzę
v
smaki są bardzo pewno w standardzie C.
Możesz także 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)
vsnprintf
jest to funkcja niestandardowa. Większość implementacji, które widziałem, implementuje to lub coś podobnego, ale jest ono specyficzne dla implementacji.
printf
printf("control string ", argument );
fprintf
fprintf (filename, "control string ", argument );
sprintf: Zapisuje sformatowane dane do ciągu znaków w pamięci zamiast standardowego wyjścia
Składnia sprintf to:
#include <stdio.h>
int sprintf (char *string, const char *format
[,item [,item]…]);
Tutaj,
Łańcuch odnosi się do wskaźnika do bufora w pamięci, w którym dane mają zostać zapisane.
Format odnosi się do wskaźnika do łańcucha znaków określającego format.
Każdy element jest zmienną lub wyrażeniem określającym dane do zapisania.
Wartość zwrócona przez sprintf jest większa lub równa zero, jeśli operacja zakończy się powodzeniem lub innymi słowy, liczba zapisanych znaków, nie licząc kończącego znaku zerowego, jest zwracana i zwraca wartość mniejszą od zera, jeśli wystąpił błąd.
printf: Drukuje na standardowe wyjście
Składnia dla printf to:
printf format [argument]…
Jedyna różnica między sprintf () a printf () polega na tym, że sprintf () zapisuje dane w tablicy znaków, podczas gdy printf () zapisuje dane na standardowe wyjście, standardowe wyjście.