• 締切済み

C言語のファイル操作について

C言語のファイル操作について ログをファイルで取りたいと思っていますが、膨大なログになってしまうため 分割してとれないかと思っています。 ・ループ一定回数で新たにファイルを起こす ・一定のライン数に達した時に新たにファイルを起こす それぞれの方法についてどのようにプログラミングしたらいいかご教授ください。

みんなの回答

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.5

>プロセス再起動時にログファイルを引き継ぎたいです >ループ一定回数で新たにファイルを起こす >一定のライン数に達した時に新たにファイルを起こす >複数箇所から呼ばれるので内部実装にしたいのです >ログは複数プロセスのログを入れようと思ってます 上記の要件を全て満足するとなると、結構大変になるかと思います。 1.要件として、複数のプロセスから書くことと、ループ一定回数で切換は、両立しません。 プロセスAが100回に1回ファイル切り替え、プロセスBが100回に1回、ファイル切換をすると プロセスAが99回出力、プロセスBが99回出力の状態では、またファイル切換はありません。 プロセスAが100回目の出力時にファイル切り替えを行うと、次のプロセスも100回目なので、 ファイルに1行かいただけで、直ちにファイル切換が発生してしまいます。 ですので、「ループ一定回数で新たにファイルを起こす」というのは、あきらめるか、 1プロセスで1ファイルにする必要があります。 2.プロセス再起動時に、ログファイルを引き継ぐためには、 以下のことを行う必要があります。 1)最新のログファイル名を特定する。 logfile.nnnn.yyyymmddで当日でnnnnが最大のファイル名を求める。 2)上記のファイルを先頭から全て読み込み、その行数を取得する。 3)一旦、クローズし、そのファイルに対して、ログ出力するようにオープンし直す。 3.複数のプロセスから書き込む場合、行数の管理をするならば、 専用のログ出力プロセスを作成し、そのプロセスに、全てファイル切り替えなどの 管理を行わせるようにすることが1つの案として考えられます。その場合、 そのログ専用プロセスへのログ出力依頼は、プロセス間通信(パイプ、TCP/IPなど)で行います。 4.複数のプロセスから書くが、ログ出力専用のプロセスを作らない場合は、 今、何行まで書いたかた等の情報を全プロセスで共有する必要があります。 その為には、共有メモリ、ファイル等が利用可能ですが、きちんとプロセス間で排他を とる必要があります。

すると、全ての回答が全文表示されます。
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.4

#3です。 更に、以下の条件についても提示されるとよいかと思います。 1.プロセス再起動時に、そのログファイルを引き継ぐ必要があるのか否か。 (もし、引き継ぐ必要があるなら、10000行ごとに切り替えの場合、起動時に すでに、9999行に達していた場合、1行のみログ出力し、 ファイル名を切換る必要があります。) 2.ループ一定回数毎にとは、どのような事でしょうか。 もう少し、具体的に説明されるとよいかと思います。

aseton19772626
質問者

お礼

プロセス再起動時にログファイルを引き継ぎたいです ループ一定回数というのは、forループなどで1000回通ったら改ページするとか、 といったことです。

すると、全ての回答が全文表示されます。
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

以下の条件を明記されると更に良い回答が得られるかと思います。 1.OS及びコンパイラ 2.#1のかたが言われているようなツールを試用しても良いのかどうか。 3.ログを書くのは、1プロセスだけなのか、それとも同じログファイルに複数のプロセスから、 ログを書くのか。 4.ログを切り替えた時の、ファイル名はどうしたいのか? 例1 logfile.yyyymmddhhmmssのように開始時のタイムスタンプを張り付ける。 例2 logfile.yyyymmdd.nnnn(nnnn=1~9999)のように日付で連番をつけたい。 等を例としてあげればよいかと思います。

aseton19772626
質問者

お礼

OSはwindowsです コンパイラはVSを使うことになると思います 複数箇所から呼ばれるので内部実装にしたいのです ログは複数プロセスのログを入れようと思ってます ファイル名は例2の通りです プログラミングスキルが足りないので実際にどうコーディングすればいいのかわからないんです

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「ループの回数」と「出力した行数」を覚えておいて, 一定値になったらファイルを変える. そんだけ.

aseton19772626
質問者

お礼

なんとなくイメージではわかるのですが実際にどうプログラミングしたらいいのかわかりません

すると、全ての回答が全文表示されます。
  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

Linuxならlogrotateに任せればいいのでは。 Windowsでも外部ツールに任せれば。

aseton19772626
質問者

お礼

内部でやりたいのですが、手段はありますでしょうか?

すると、全ての回答が全文表示されます。

関連するQ&A