• 締切済み

ファイルへの書込み処理が異常に遅い

以下のファイルへの書込みを行なうプログラムの処理速度が極端に遅く困惑しています。 -------------------------------------------------------------------------------- /*  文字列"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です。 原因と解決策をご存知の方、よろしくご教示下さい。

みんなの回答

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.5

ちなみに、バイナリモードであけて、最後尾にはfseekでディスクリプター飛ばした方が、速いと思いますよ。 変にテキスト処理をfopenにさせてるのが問題なんで。 まあ、処理時間計測するなら、各APIの呼び出しと返却毎にタイム計測して、原因特定するのが普通ですけどね。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

よく見ると、 fprintf( fp "0," ); の部分もfpの後のコンマが抜けていますね。 それに、 fopen( "C:\hogehoge.log", "a" ) のとことでも、\\ではなく\になっています。 というわけで、このソースがコンパイルできる可能性は皆無です。 実際に使用したソースコードを補足してください。

heikki_sorse
質問者

補足

回答ありがとうございます。 申し訳ありません、実機ではネットができない&持ち出し不可のため質問のプログラムは手でタイプしたものです。 fopen( "C:\\hogehoge.log", "a" ) fprintf( fp, "0," ); fprintf( fp, "\n" ); の誤りです。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

本当にこのプログラムで(実行時間はともかく)動いたのでしょうか? fprintf( "\n" );の部分は、第1引数にFILE*型でストリームを指定する必要があるはずです。これがコンパイルできるということは、stdio.hが破壊されているか、全く別の(素性不明の)stdio.hがインクルードされているものと思われます。

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.2

fprintfがカンマを認識して何かしているのかなぁ。  fprintf( fp "0," ); を、 fputc('0',fp);fputc(',', fp); に変えても速度は変わりませんか? それと、何で1行ごとにfopen/closeしなければいけないのか理解に苦しみます。

heikki_sorse
質問者

お礼

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

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.1

ファイルポインタ、テキストの追記で開けば、カンマ等は区切り文字扱いだから劇的に遅くなります。 まあ、普通同一ファイルをループの中で開けてる、しかもfseek()等してないなら、バグですね。

heikki_sorse
質問者

お礼

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

関連するQ&A

専門家に質問してみよう