C言語関係掲示板

過去ログ

No.250.fprintf と fwrite


No.1507

ファイルへの書き込みについて
投稿者---nogu(2002/05/15 21:43:56)


データベースから取得したデータをファイルに書き込む際に、
一つ一つの項目をfprintfで書き込むのと、構造体に格納して
fwriteで1回で書き込むのとでは速度は同じなのでしょうか。
また、どちらが推奨されているのでしょうか。


No.1519

Re:ファイルへの書き込みについて
投稿者---ともじ(2002/05/18 16:02:07)


こんにちは、返信遅くなりました。

>データベースから取得したデータをファイルに書き込む際に、
>一つ一つの項目をfprintfで書き込むのと、構造体に格納して
>fwriteで1回で書き込むのとでは速度は同じなのでしょうか。
>また、どちらが推奨されているのでしょうか。

構造体をファイルに書き込むには一般にfwriteが使われます。
ですから、推奨という意味ではfwriteになるでしょう。

また、fprintfは書式指定に応じてデータをテキスト変換して
ファイルに書き込みます。
例えば、1 というデータをfprintfを使って
 fprintf( fp, "%d", 1 );
のようにファイルに書き込むと、
実際に書き込まれるデータは 0x31 になります。
ですから、1 を 0x01 で書き込むにはfwriteを使う必要があります。

No.1524

Re:ファイルへの書き込みについて
投稿者---かずま(2002/05/18 19:04:02)


> データベースから取得したデータをファイルに書き込む際に、
> 一つ一つの項目をfprintfで書き込むのと、構造体に格納して
> fwriteで1回で書き込むのとでは速度は同じなのでしょうか。

fprintf は値をテキストに変換するので、その分 fwrite より
遅くなるような気がします。しかし、そんな変換よりもディスク
アクセスのほうが遅いので、ディスクに書き込むデータ量が速度
に影響するとも言えます。例えば、

 struct s { int v; char s[80]: } x = { 3, "abc" };

という構造体データがあった場合、fwrite だと常に84バイト(int
が 2バイトの場合 82バイト)書き込みますが、
fprintf(fp, "%d %s\n", x.v, x.s); だと、6バイト(改行コードが
CR LF の場合 7バイト)になるので、こういうデータが大量にあると、
fprintf のほうが速いかもしません。


> また、どちらが推奨されているのでしょうか。

fwrite で書いた場合、そのファイルは環境に依存します。異なる
CPU、異なる OS、異なるコンパイラで読めるとは限りません。エン
ディアンやアラインメント、int のサイズの違いがあるからです。

fwrite で連続して同じデータを書いた場合、固定長レコードの
ファイルとなるので、任意のレコードを直接読み出すことができる
という利点が出てきたりもします。fprintf でもできますが。

どのようなデータを書くか、書き込んだファイルをどんな風に使う
かなどによって fprintf と fwrite を使い分けるべきでしょう。

戻る


「初心者のためのポイント学習C言語」 Last modified:2002.06.22
Copyright(c) 2000-2002 TOMOJI All Rights Reserved