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

カウンターを作ろうとしてるんですけど、入出力共用が出来ないんです。
その部分は

open INOUT, "+>$txt";       #$txtはテキストファイルへのアドレス
$count = <INOUT>;
$count++;
print INOUT $count;
close INOUT;

ってやっています。ここだけコマンドプロンプトで試しているんですが、上手く動きません。"+>$txt"を"+<$txt"としたり、">+$txt"にしたり、最後には、">+<$txt"といろいろ試したんですがダメでした。
ちなみに

open IN, "<$txt";
$count = <IN>;
close IN;
$count++;
open OUT, ">$txt";
print OUT $txt;
close OUT;

ってやると動きます。別にこれでもいいんですが、本には共用出来ると書いてあるのに出来ない、なんかすっきりしません。
入出力共用って出来ないんでしょうか?

A 回答 (1件)

 共用オープンはプロでもそうそうには使いません。


 面倒臭いんで。まあ、使う人は使うかもしれませんが。

 ファイルの操作には、「現在操作位置」というものがあります。いわゆる「シーク位置」と呼ばれるものです。

 たとえば、4行のテキストファイルを順に読み出すと、1行ずつ順番に読まれます。途中で2行同じものが入ってきたりはしません。
 これはなぜかというと、1回読み込みを行うと、プログラムが自動的にシーク位置を次の行へ移動してくれるからです。

 また、書き込みのときも同様で、「書き込み位置」をシステムが自動的に管理してくれています。

 しかし、入出力共用オープンの場合、これをプログラマーがやってあげなければいけません。
 たとえば質問の例だと、オープンした時点では「書き込み位置」が定義されていないので、プログラムは混乱してあらぬところにデータを書き込むとか、まったく書き込まなかったりとかしてしまいます。

 ですので、プログラマーがどこに書き込むかを指定してあげるのです。

open INOUT, "+<$txt";
$count = <INOUT>;
$count++;
seek(INOUT, 0, 0);
print INOUT $count;
close INOUT;

 それから、読み書き共用モードの指定は「+<」こうです。
 「+>」これだとファイルの内容が壊れますのでご注意を。

 まあ、プログラムをすっきりさせる意味で、共用モードはあんまり使わない方がいいかもしれません。好きずきですが。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/10/11 13:36

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