アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下のファイルへの書込みを行なうプログラムの処理速度が極端に遅く困惑しています。

--------------------------------------------------------------------------------
/*
 文字列"0,"をファイルに約2MB出力するプログラム
 (2000文字で改行、1行毎にfopen&fclose)
*/
#include<stdio.h>

void main( int argc, char *argv[] )
{
  FILE *fp;

  for( int i = 0; i < 1000; i++ )
  {
    if( !(fp = fopen( "C:\hogehoge.log", "a" ) ) )
    {
      exit( 1 );
    }

    for( int j = 0; j < 1000; i++ )
    {
      fprintf( fp "0," );
    }

    fprintf( "\n" );
    fclose( fp );
  }

  exit( 0 );
}
--------------------------------------------------------------------------------

処理時間は5分程度です。
出力する文字列を"0#"に変えると5~6秒で終了します。
カンマが入ると違うのでしょうか?

OSはWinXP、コンパイラはVC++7.0です。
原因と解決策をご存知の方、よろしくご教示下さい。

A 回答 (5件)

ちなみに、バイナリモードであけて、最後尾にはfseekでディスクリプター飛ばした方が、速いと思いますよ。



変にテキスト処理をfopenにさせてるのが問題なんで。

まあ、処理時間計測するなら、各APIの呼び出しと返却毎にタイム計測して、原因特定するのが普通ですけどね。
    • good
    • 0

よく見ると、



fprintf( fp "0," );

の部分もfpの後のコンマが抜けていますね。
それに、

fopen( "C:\hogehoge.log", "a" )

のとことでも、\\ではなく\になっています。

というわけで、このソースがコンパイルできる可能性は皆無です。
実際に使用したソースコードを補足してください。

この回答への補足

回答ありがとうございます。
申し訳ありません、実機ではネットができない&持ち出し不可のため質問のプログラムは手でタイプしたものです。

fopen( "C:\\hogehoge.log", "a" )
fprintf( fp, "0," );
fprintf( fp, "\n" );

の誤りです。

補足日時:2006/09/12 07:49
    • good
    • 0

本当にこのプログラムで(実行時間はともかく)動いたのでしょうか?



fprintf( "\n" );の部分は、第1引数にFILE*型でストリームを指定する必要があるはずです。これがコンパイルできるということは、stdio.hが破壊されているか、全く別の(素性不明の)stdio.hがインクルードされているものと思われます。
    • good
    • 0

fprintfがカンマを認識して何かしているのかなぁ。


 fprintf( fp "0," );
を、
fputc('0',fp);fputc(',', fp);
に変えても速度は変わりませんか?

それと、何で1行ごとにfopen/closeしなければいけないのか理解に苦しみます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
fputc()でも試しましたが同じでした。
実際作りたいプログラムはもっと煩雑です。
詳しくは申し上げませんが1行毎にfopen、fcloseを前提とした回答をお願い致します。
知りたいのは「カンマが入るとなぜファイル出力が遅いのか」ということです。

お礼日時:2006/09/12 07:43

ファイルポインタ、テキストの追記で開けば、カンマ等は区切り文字扱いだから劇的に遅くなります。



まあ、普通同一ファイルをループの中で開けてる、しかもfseek()等してないなら、バグですね。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
んー、カンマがあると遅くなるのですね。。。
質問のプログラムは簡易に書きましたが、実際に作りたいプログラムはファイル出力以外にも処理があり、1行毎にfopen、fcloseは必須と考えています。
いま実機が無いので確認できませんが、fseek()を試してみます。

お礼日時:2006/09/11 22:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A