例を使って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
は標準出力ストリームに出力します(stdout
)
fprintf
はファイルハンドルに移動します(FILE*
)
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
はstreamへの出力に使用されます。
sprintf(buffer,...)
は、文字列をバッファにフォーマットするために使用されます。
vsprintf
、vfprintf
およびvprintf
もあることに注意してください。
printf
printf("control string ", argument );
fprintf
fprintf (filename, "control string ", argument );
です。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)
fprintf
はprintf
がfprintf
に似ているがストリームには関連していないステートメントである、つまりfprintf
がファイルに関連している場合のストリームに関連しています。
sprintf:フォーマットされたデータを標準出力ではなくメモリ内の文字列に書き込む
Sprintfの構文は次のとおりです。
#include <stdio.h>
int sprintf (char *string, const char *format
[,item [,item]…]);
ここに、
文字列は、データが書き込まれるメモリ内のバッファへのポインタを指します。
フォーマットとは、フォーマットを定義する文字列へのポインタのことです。
各項目は、書き込むデータを指定する変数または式です。
操作が成功した場合はsprintfが返す値はゼロ以上、つまり、書き込まれた文字数で、終端のヌル文字はカウントされずに返され、エラーが発生した場合はゼロ未満の値が返されます。
printf:標準出力に出力します
Printfの構文は次のとおりです。
printf format [argument]…
Sprintf()とprintf()の唯一の違いは、sprintf()がデータを文字配列に書き込むのに対して、printf()は標準出力デバイスのstdoutにデータを書き込むことです。