、、、の違いについて簡単な英語printf
で fprintf
、sprintf
例を使って説明できますか?
どのストリームにありますか?
「Cでのファイル処理」について読んでいるとき、私はこれら3つの間で本当に混乱しています。
、、、の違いについて簡単な英語printf
で fprintf
、sprintf
例を使って説明できますか?
どのストリームにありますか?
「Cでのファイル処理」について読んでいるとき、私はこれら3つの間で本当に混乱しています。
回答:
Cでは、「ストリーム」は抽象概念です。プログラムの観点からは、単にバイトのプロデューサー(入力ストリーム)またはコンシューマー(出力ストリーム)です。これは、ディスク上のファイル、パイプ、端末、またはプリンターやttyなどの他のデバイスに対応できます。FILE
タイプは、ストリームに関する情報が含まれています。通常、FILE
オブジェクトのコンテンツを直接操作するのではなく、オブジェクトへのポインタをさまざまなI / Oルーチンに渡すだけです。
3つの標準ストリームがあります。stdin
は、標準入力ストリームstdout
へのポインター、は標準出力ストリームstderr
へのポインター、および標準エラー出力ストリームへのポインターです。インタラクティブセッションでは、3つは通常コンソールを指しますが、他のファイルまたはデバイスを指すようにリダイレクトできます。
$ myprog < inputfile.dat > output.txt 2> errors.txt
この例では、stdin
はを指し、inputfile.dat
はをstdout
指し、output.txt
はをstderr
指しerrors.txt
ます。
fprintf
指定した出力ストリームにフォーマット済みテキストを書き込みます。
printf
これはfprintf(stdout, ...)
、標準出力ストリームが現在指している場所に書き込みおよびフォーマット済みテキストを書き込むことと同等です。
sprintf
char
ストリームではなく、フォーマットされたテキストをの配列に書き込みます。
printf( "format"、args)は、多くの場合コンピュータモニタである標準出力にデータを印刷するために使用されます。
sprintf(char *、 "format"、args)は、printfに似ています。フォーマットされた文字列を標準出力(モニター)に表示する代わりに、charポインター(最初のパラメーター)が指す文字列にフォーマットされたデータを格納します。文字列の場所は、printf構文とsprint構文の唯一の違いです。
fprintf(FILE * fp、 "format"、args)は、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にデータを書き込むことです。