Herkes arasındaki farklar hakkında basit İngilizce olarak açıklayabilir printf
, fprintf
ve sprintf
örneklerle?
Hangi akışta?
"C Dosya İşleme" hakkında okurken bunların üçü arasında gerçekten kafam karıştı.
Herkes arasındaki farklar hakkında basit İngilizce olarak açıklayabilir printf
, fprintf
ve sprintf
örneklerle?
Hangi akışta?
"C Dosya İşleme" hakkında okurken bunların üçü arasında gerçekten kafam karıştı.
Yanıtlar:
C'de, bir "akım" bir soyutlamadır; program açısından bakıldığında, sadece bayt üreticisi (girdi akışı) veya tüketicisidir (çıktı akışı). Diskteki bir dosyaya, bir boruya, terminalinize veya yazıcı veya tty gibi başka bir aygıta karşılık gelebilir. FILE
Tip akışında hakkında bilgi içerir. Normalde, bir FILE
nesnenin içeriğini doğrudan karıştırmazsınız, sadece çeşitli I / O rutinlerine bir işaretçi iletirsiniz.
Üç standart akış vardır: stdin
standart giriş akışına stdout
bir işaretçi, standart çıkış akışına stderr
bir işaretçi ve standart hata çıkış akışına bir işaretçi. Etkileşimli bir oturumda, üçü genellikle konsolunuza başvurur, ancak bunları diğer dosyalara veya cihazlara işaret edecek şekilde yönlendirebilirsiniz:
$ myprog < inputfile.dat > output.txt 2> errors.txt
Bu örnekte, stdin
şimdi işaret eder inputfile.dat
, stdout
işaret eder output.txt
ve stderr
işaret eder errors.txt
.
fprintf
biçimlendirilmiş metni belirttiğiniz çıkış akışına yazar.
printf
yazmaya eşdeğerdir fprintf(stdout, ...)
ve biçimlendirilmiş metni standart çıktı akışının işaret ettiği yere yazar.
sprintf
char
bir akışın aksine bir diziye biçimlendirilmiş metin yazar .
printf ("format", args), verileri genellikle bilgisayar monitörü olan standart çıktıya yazdırmak için kullanılır.
sprintf (char *, "format", args) printf gibidir. Biçimlendirilmiş dizeyi standart çıktıda, yani bir monitörde görüntülemek yerine, biçimlendirilmiş verileri karakter işaretçisi (ilk parametre) ile gösterilen bir dizede saklar. Dize konumu printf ve sprint sözdizimi arasındaki tek farktır.
fprintf (DOSYA * fp, "biçim", argümanlar) tekrar printf gibidir. Burada bunun yerine, verileri monitörde görüntülerken veya bir dizeye kaydederken, oluşturulan veriler fprintf'in ilk parametresi olarak kullanılan dosya işaretçisi tarafından işaret edilen bir dosyaya kaydedilir. Dosya tanıtıcısı printf sözdiziminin tek ekidir.
Eğer stdout dosyası fprintf'de ilk parametre olarak kullanılırsa, çalışması printf'inkine eşdeğer kabul edilir.
printf(...)
eşittir fprintf(stdout,...)
.
fprintf
akışı çıktı almak için kullanılır.
sprintf(buffer,...)
bir dizeyi arabelleğe biçimlendirmek için kullanılır.
Not orada da vsprintf
, vfprintf
vevprintf
v
Tatlar inanıyorum standart dışı olan
v
Tatlar C standardında çok kesinlikle vardır.
Vsnprintf () işleviyle de çok faydalı şeyler yapabilirsiniz:
$ 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
Standart dışı bir işlev olduğunu unutmayın. Gördüğüm çoğu uygulama bunu ya da buna benzer bir şeyi uyguluyor, ancak uygulamaya özel.
printf
printf("control string ", argument );
fprintf
fprintf (filename, "control string ", argument );
sprintf: Biçimlendirilmiş verileri stdout yerine bellekteki bir karakter dizesine yazar
Sprintf sözdizimi:
#include <stdio.h>
int sprintf (char *string, const char *format
[,item [,item]…]);
Buraya,
Dize, verilerin yazılacağı bellekteki bir arabellek işaretçisini belirtir.
Biçim, biçimi tanımlayan bir karakter dizesine işaret eder.
Her öğe, yazılacak verileri belirten bir değişken veya ifadedir.
İşlem başarılı olursa sprintf tarafından döndürülen değer sıfırdan büyük veya ona eşittir, başka bir deyişle, sonlanan boş karakteri saymamak için yazılan karakter sayısı döndürülür ve bir hata oluşursa sıfırdan küçük bir değer döndürür.
printf: Stdout'a yazdırır
Printf için sözdizimi:
printf format [argument]…
Sprintf () ve printf () arasındaki tek fark sprintf () 'nin bir karakter dizisine veri yazması, printf () ise standart çıkış aygıtı olan stdout'a veri yazmasıdır.