• 締切済み

ファイルへ書込み

こんにちわ。 ■質問1 ファイルへの書込み(書替え)をどうやってやればいいか悩んでいます。 既に存在する aaa.txt という名前のファイルがあるとします。 aaa.txtをファイルオープンし、ある文字列をキーに検索し、 値を書替えたいのです。 以下の例の様にaaa.txtに、書かれているとします。 例)aaa.txtファイルの中身 LOOP_CNT1=50 LOOP_CNT2=100 LOOP_CNT3=200 LOOP_CNT4=300 LOOP_CNT5=400 "LOOP_CNT3"という文字列をキーに、ファイルから対象文字列を検索し、設定値の 200 を 10000 に書き換えたいのです。 書き換える値、10000 はパラメータから取得します。 書き換えれる場合、それ以降の文字列の値が 上書かれてしまったり、領域を壊してしまったりはしないでしょうか? いい方法があったら教えてください! ■質問2 新規でオープンしたファイルに、 DBからループ処理で取得した値を書き込む処理を行うとします。 ※データは何件あるか分からず、なくなるまで処理します。 エラーが起きた場合のみ、ファイル書込み処理を行っていても 最終的には何も書かれていない0バイトファイルを作成したいのですが どのようにやればいいでしょうか? ※一時的にテンポラリ領域に、格納してエラーがなかった場合のみ ファイルへ書込む場合、テンポラリはどのような持ち方をすれいいで しょうか? テンポラリ用にchar型の変数を用意? データが何件あるか分からないので、 変数のサイズはどのように宣言すればいいですか? そもそも考え方が間違っていますか?

みんなの回答

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.3

> ■質問1 > 書き換えれる場合、それ以降の文字列の値が > 上書かれてしまったり、領域を壊してしまったりはしないでしょうか? ファイルを読みながら書き換えることはできませんので、#1さんのように 処理することが普通です。 >100行目とわりとすぐに見つかった場合、100行目以降のファイルの内容を > 一気に書込む方法はありますか? fseek, ftell, fread,などを使って、既に読み込んだ箇所以降をバッファに まとめ読みし、テンポラリファイルに書き込む方法などが考えられますが、 バッファ管理をする分、バグの入り込む余地はあるし(別に大した管理ではないけど)、 メモリの使用量も増えます。 ベタな方法で検証してみて、それでダメなら改善するのが良いと思いますけどね。 爆発的にデータが増えると予想されるのなら、そもそも1ファイルで扱うことに 無理があると思いますし、その場合は、設計を見直した方が良いと思います。 > ■質問2 0バイトのファイル作成にこだわっておられるようなのですが、 その件については、以前に同じような質問をされてましたよね。 そちらの検証・回答をしましょうね。 ファイルが0バイトならエラーが発生したとする方法より、 エラーが発生したことを返すような素直な実装にすることはできないのでしょうか。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

>書き換えれる場合、それ以降の文字列の値が >上書かれてしまったり、領域を壊してしまったりはしないでしょうか? それはあなたの腕次第だよ。 >エラーが起きた場合のみ、ファイル書込み処理を行っていても >最終的には何も書かれていない0バイトファイルを作成したい エラーは何処で起きると想定しているのですか? もしかして I/O エラーとかじゃなくて、 DB のレコードに「想定外のデータ」が含まれているという意味ですか? >※一時的にテンポラリ領域に、格納してエラーがなかった場合のみ >ファイルへ書込む場合、テンポラリはどのような持ち方をすれいいでしょうか? お好きなように。

goo393
質問者

補足

質問2 >もしかして I/O エラーとかじゃなくて、 >DB のレコードに「想定外のデータ」が含まれているという意味ですか? ■エラーは、DBからデータを取得する際、オラクルエラーが発生した場合 のエラーの事です。

  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.1

> ■質問1 1)aaa.txtを読み込み用にオープンする。 2)任意の名前のファイルを書き込み用にオープンする。 3)aaa.txtを1件ずつ読んでいく。 4)所定の条件にヒットしなければ、読んだデータをそのまま2)のファイルに書き込む。 5)所定の条件にヒットすれば、書き換えたデータを2)のファイルに書き込む。 6)読み込むデータがなくなったら、1)と2)のファイルをクローズする。 7)2)のファイルをaaa.txtにコピーする。 8)2)のファイルを削除する。

goo393
質問者

補足

なるほど。こうゆう方法もありですね! 気になったのが、ファイルの行数が10000行で、対象の行が 100行目とわりとすぐに見つかった場合、100行目以降のファイルの内容を 一気に書込む方法はありますか?そういう方法があれば多少なりとも 処理時間が早くなるのかなーと思ったので。 もしも知っていたら、教えてください。

関連するQ&A

専門家に質問してみよう