web-dev-qa-db-ja.com

fprintf、printf、sprintfの違いは?

例を使ってprintffprintf、およびsprintfの違いについて簡単な英語で説明できる人はいますか。

それは何の流れですか?

「Cでのファイル処理」について読みながら、これら3つの間で本当に混乱しています。

192
mr_eclair

Cでは、「ストリーム」は抽象化です。プログラムの観点からは、単にバイトのプロデューサ(入力ストリーム)またはコンシューマ(出力ストリーム)です。それはディスク上のファイル、パイプ、端末、あるいはプリンタやttyのような他のデバイスに対応します。 FILE型には、ストリームに関する情報が含まれています。通常、FILEオブジェクトの内容を直接めちゃくちゃにするのではなく、単にそれへのポインタをさまざまなI/Oルーチンに渡します。

標準ストリームは3つあります。stdinは標準入力ストリームへのポインタ、stdoutは標準出力ストリームへのポインタ、stderrは標準エラー出力ストリームへのポインタです。対話型セッションでは、3つは通常あなたのコンソールを参照しますが、他のファイルやデバイスを指すようにリダイレクトすることもできます。

$ myprog < inputfile.dat > output.txt 2> errors.txt

この例では、stdininputfile.datを指し、stdoutoutput.txtを指し、そしてstderrerrors.txtを指しています。

fprintfは、フォーマットしたテキストを指定した出力ストリームに書き込みます。

printffprintf(stdout, ...)を書くのと同等で、標準出力ストリームが現在指しているところにフォーマットされたテキストを書きます。

sprintfは、ストリームではなく、フォーマットされたテキストをcharの配列に書き込みます。

212
John Bode

printfは標準出力ストリームに出力します(stdout

fprintfはファイルハンドルに移動します(FILE*

sprintfは、割り当てたバッファに移動します。 (char*

138
Moo-Juice

printf( "format"、args)は、コンピュータのモニターであることが多い標準出力にデータを印刷するために使用されます。

sprintf(char *、 "format"、args)はprintfに似ています。フォーマットされた文字列を標準出力、すなわちモニタに表示する代わりに、フォーマットされたデータをcharポインタによって指し示された文字列(一番最初のパラメータ)に格納します。文字列の位置は、printf構文とsprint構文の唯一の違いです。

fprintf(FILE * fp、 "format"、args)はまたprintfに似ています。ここではデータをモニタに表示したり、文字列で保存したりする際に、フォーマットされたデータはfprintfの最初のパラメータとして使用されるファイルポインタによってポイントされるファイルに保存されます。ファイルポインタはprintfの構文への唯一の追加です。

stdoutファイルがfprintfの最初のパラメータとして使用されている場合、その作業はprintfの作業と同等と見なされます。

26
Rubal

printf(...)fprintf(stdout,...)と同等です。

fprintfはstreamへの出力に使用されます。

sprintf(buffer,...)は、文字列をバッファにフォーマットするために使用されます。

vsprintfvfprintfおよびvprintfもあることに注意してください。

22
VGE

printf

  1. printfは画面に出力を実行するために使用されます。
  2. syntax = printf("control string ", argument );
  3. ファイル入出力とは関係ありません

fprintf

  1. FILEハンドルが指すファイルに書き込み操作を実行するために使用されたfprintf。
  2. 構文はfprintf (filename, "control string ", argument );です。
  3. ファイルの入出力に関連付けられています
2
Amit Vasava

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)
2

fprintfprintffprintfに似ているがストリームには関連していないステートメントである、つまりfprintfがファイルに関連している場合のストリームに関連しています。

0
kavamsi12

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にデータを書き込むことです。

0
Fahad Ali