• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:入出力共用が出来ないんです)

入出力共用ができない理由とは?

このQ&Aのポイント
  • 入出力共用ができない理由とは?プログラム中でファイルの読み書きを行う際に、一部の処理で入出力共用ができない場合があります。
  • 具体的な例として、カウンターを作るプログラムで入出力共用ができないケースがあります。一部の処理では、ファイルを読み込みながら書き込む必要があるため、入出力共用ができなくなります。
  • 入出力共用ができない場合は、一度ファイルを読み込んでから書き込む方法を取ることで回避できます。しかし、本には入出力共用ができると書いてある場合など、状況によっては混乱を招くこともあります。

質問者が選んだベストアンサー

  • ベストアンサー
noname#25358
noname#25358
回答No.1

 共用オープンはプロでもそうそうには使いません。  面倒臭いんで。まあ、使う人は使うかもしれませんが。  ファイルの操作には、「現在操作位置」というものがあります。いわゆる「シーク位置」と呼ばれるものです。  たとえば、4行のテキストファイルを順に読み出すと、1行ずつ順番に読まれます。途中で2行同じものが入ってきたりはしません。  これはなぜかというと、1回読み込みを行うと、プログラムが自動的にシーク位置を次の行へ移動してくれるからです。  また、書き込みのときも同様で、「書き込み位置」をシステムが自動的に管理してくれています。  しかし、入出力共用オープンの場合、これをプログラマーがやってあげなければいけません。  たとえば質問の例だと、オープンした時点では「書き込み位置」が定義されていないので、プログラムは混乱してあらぬところにデータを書き込むとか、まったく書き込まなかったりとかしてしまいます。  ですので、プログラマーがどこに書き込むかを指定してあげるのです。 open INOUT, "+<$txt"; $count = <INOUT>; $count++; seek(INOUT, 0, 0); print INOUT $count; close INOUT;  それから、読み書き共用モードの指定は「+<」こうです。  「+>」これだとファイルの内容が壊れますのでご注意を。  まあ、プログラムをすっきりさせる意味で、共用モードはあんまり使わない方がいいかもしれません。好きずきですが。

zeyper
質問者

お礼

そうだったんですか、ありがとうございます。 素直に読み込みが終わった後に、また書き込むようにします。 seek関数ってそういうときに使うんですね、本で読んだけどいつ使うのかよく分から無かったんですよ。 ちなみに、僕が読んだ本だと「+>」になってました。(笑) それでは、丁寧な回答ありがとうございました。m(_ _)m