No.3ベストアンサー
- 回答日時:
>flock(OUT, 2);
お使いのOSはWindows98系ですか?
Windows98系であれば、flockそのものが使えません。
(flock関数そのものが実装されていない、エラーメッセージでimplements関係のメッセージが出ていればそうです)
Windows系で確かめるのであれば、WordかExcelで読みこみファイル
“a.dat”を開いておくのが良いです。
あと、読み込み始めると言っても、システムによってロックされているので
データをガシガシ読めるわけではなく(それじゃOSが機能してないですね)
1行目の1文字目でEOFが返ります。(少なくとも普通のOSならそうなるはずです)
(ファイルは普通はOSが守ってくれます)
あとはご自分で調べてください。
どうもおかしいと思ったら、Win98 では
flock が使えなかったんですね。
実際にアップして実験したら、2つのコメントを
外して、ロックしているのに読み込める
というのを確かめることができました。
flock というのはロックのフラグのようなもので
それだけではファイルはロックされない。
ファイルに触れさせないためのロックの
処理については、flock でのフラグの値によって
場合分けをし、ロックされていればファイルに
触れさせない処理を書く
という方法で本当のロックが実現できるわけですね。
ありがとうございました。
たくさん勉強になりました。
No.2
- 回答日時:
>open(IN, "a.dat");
>↑この1行が実行された時点で、a.dat のデータの全てが
>読み込まれてしまうんですか?
いいえ、読み込まれません。
デフォルトでは、(例えば
open(STDOUT , "display");
というような意味合いにしているのと同様です。
大体2つのことをしており、
ひとつは“ファイル名”にファイルハンドルを結びつけること、
もうひとつは、ファイルがオープンできるかどうかをチェックすること。
(ただし、チェックするだけで、制御してくれるわけではないことが注意点です。
自分でエラー処理をしないと、次の< >でシステムにロックされているような
ファイルでも平気で読み込みを始めます。open関数は「偽」を返すという
だけで処理が止まるわけではない点が注意点です)
実際に「ファイルにアクセスしてデータを読み込んでいるのは、< >演算子」です。
< >演算子は、スカラーコンテキスト(この場合、=の左辺が$~)であれば、
“一行分だけ「ファイル」からデータを読み込みます”
又、< >演算子は、リストコンテキスト(この場合、=の左辺が@~)であれば、
“「ファイル」全部の行を一気に読み込みます”
〔但し(<IN>)[0..9]というようにスライスしといてメモリを節約することは可能〕
ただし、「$系の一行処理=低速・メモリ節約」であり「@系の一括処理=高速・メモリ消費」です。
(でもはっきり言えば、扱うのが、とんでもないでかい動画
とかでもないかぎり、一括で読み込んだほうが、大抵いいですよ。
少なくともBBS程度の1M以下のテキストだったら、
一括で呼んだほうが賢いです。
(メモリの方は今や128M~256Mは搭載されているわけですから。。。)
この回答への補足
ありがとうございます。
スライスの使い方は知らなかったのでうれしかったです。
ロックされているようなファイルでも
平気で読み込みを始める
というのが気になりました。
open(OUT,"a.dat");
#flock(OUT, 2);
open(IN,"a.dat");
print $hajime = <IN>; #a.dat の1行を表示
close(IN);
#flock(OUT, 8);
close(OUT);
↑のソースで実験してみようと思ったけど、
2つの # を消すと、close(OUT); 以降の処理が
あった場合、その処理がされないからスクリプトエラー
になっているんだと思いました。
flock 自体がよく分かっていないんです。
これがきちんと書けていたら、ロックされているのに
読み込みができるというのを確認することができると
思いました。
ソースのどこを直せばいいんですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでCSVファイルを途中行まで...
-
VBAでCSVファイルの特定行を書...
-
ExcelをCSV書き出す場合のシー...
-
エクセルVBA コードが同じでも...
-
拡張子 ”log” と ” dat” の違い
-
CSVが可変長の場合の検索方法
-
csvファイル改行コードの置換に...
-
VBAで巨大なファイルの途中から...
-
VBScriptでファイル保存先のデ...
-
検索ボックスから製品名を検索...
-
ファイルロックのおすすめプロ...
-
Perlの変数に文字数制限(容量...
-
エクセルVBAでCSVファイ...
-
openした後、closeしないでプロ...
-
MATLAB グローバル変数の宣言
-
C言語でのファイルのデータ更...
-
close()で例外が投げられる理由
-
awkスクリプトでダブルクォーテ...
-
エクセルVBAで素数だけを出力す...
-
vba dir の相対パス
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでCSVファイルを途中行まで...
-
エクセルVBA コードが同じでも...
-
VBAでCSVファイルの特定行を書...
-
ExcelをCSV書き出す場合のシー...
-
ReadLineでの読み出し行を指定する
-
openした後、closeしないでプロ...
-
JavaでCSVファイルを高速に読む...
-
VBAで巨大なファイルの途中から...
-
拡張子 ”log” と ” dat” の違い
-
csvファイル改行コードの置換に...
-
C言語でのファイルのデータ更...
-
VB6.0でDB接続する際に切断時の...
-
Perlの変数に文字数制限(容量...
-
Perl Vlookupみたいに
-
CSVファイルについて
-
MATLAB グローバル変数の宣言
-
エクセルVBAでCSVファイ...
-
VBScriptでファイル保存先のデ...
-
Monster'sの改造・・・ボスモン...
-
perlで、後ろの行を読んで、前...
おすすめ情報