fprintf、printf、sprintfの違いは?


233

、、、の違いについて簡単な英語printffprintfsprintf例を使って説明できますか?

どのストリームにありますか?

「Cでのファイル処理」について読んでいるとき、私はこれら3つの間で本当に混乱しています。


4
いくつかのサンプルコードを記述して、それらを試してください。これは、両者の違いを明確に理解する非常に簡単な方法です。
Nawaz、2011年

14
ばかげたバッファオーバーフローを避けるために、sprintf()よりもsnprintf()を優先してください。
Maxim Egorushkin、2011年

3
ストリームまたはBoostフォーマッタを優先して、ばかげたバッファオーバーフローや厄介なタイプ安全でないバグを回避します
John Dibling

7
@Maxim、あなたが有効なポイントを上げている間、私は私のバッファがオーバーフローしてアプリがバラバラにならないことを知っているので安全を確保します。ストリーム/ブーストフォーマッターが顕著なボトルネックを引き起こしていることが示された場合にのみ、これらの関数を調べます。:)
Moo-Juice

1
@Maxim:ポイントは、必要がないということです。私のコードはボトルネックではありません。5m /秒は、取引所が送信するメッセージの数であり、処理できるメッセージの数ではありません。それでは、なぜ時期尚早に最適化するのでしょうか?
John Dibling

回答:


238

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, ...)、標準出力ストリームが現在指している場所に書き込みおよびフォーマット済みテキストを書き込むことと同等です。

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


4
「単にバイトのプロデューサー(入力ストリーム)またはコンシューマー(出力ストリーム)です。」これらは逆ですか?プロデューサーは何かを作成(出力)しませんか?本当にわからないので聞いてみます。
Dave Voyles 2017年

6
@DaveVoyles:これらはプログラムの観点からのものです。入力ストリームは、プログラムが読み取るバイトを生成します。出力ストリームは、プログラムから生成されたバイトを消費します。
John Bode

153

printf標準出力ストリームへの出力(stdout

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

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


40

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

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

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

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


24

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

fprintf ストリームへの出力に使用されます。

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

注そこにもあるvsprintfvfprintfvprintf


vフレーバーは非標準私は信じている
ジョンDibling

8
vフレーバーはC標準では非常に確かにあります。
Fred Foo

@larsmans:ああ、わかりました。訂正ありがとうございます。この質問は、ある時点で[c ++]のタグが付けられました
John Dibling

2

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)

+1は確かに便利ですが、これvsnprintfは非標準の機能であることに注意してください。私が見たほとんどの実装はこれまたはそれに似たものを実装していますが、実装固有です。
John Dibling

1
@larsmansは、これが実際にはC標準の一部であることを上記で言及しているため、私はそれを取り戻します
John Dibling

2
これはCとどのような関係がありますか?
onemasse

2

printf

  1. printfは、画面上の出力を実行するために使用されます。
  2. 構文= printf("control string ", argument );
  3. ファイルの入出力に関連付けられていません

fprintf

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

これが他の場所から引用されている場合は、ソースをリンクで引用するのが最善ですが、ここで引用したテキストを確実に保持してください。
SuperBiasedMan 2015年

0

fprintfこれは、ストリームに関連していますが、ストリームには関連しprintffprintfいませんfprintfが、ファイルには関連しています。


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.