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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pandasでまとめてインデックスを削除するにはどうすればいいですか? たとえば、以下のプログラムで 1 2022/07/31 23:09
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- MySQL MYSQL エラー 2 2022/10/18 11:37
- Ruby パイソンでテキストファイルが読み込めない 1 2022/11/14 16:42
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- UNIX・Linux Linuxについて質問です。 以下のような設定をしたMakefileを作成するにはどう記述すればよい 1 2023/02/03 20:10
- その他(プログラミング・Web制作) Sikulix2.0.5(Jython2.7.3)でcsvを読込WEB検索条件にpasteで文字化け 1 2023/03/31 11:02
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- その他(プログラミング・Web制作) atcoder python コードへの助言 2 2022/08/12 15:31
- その他(プログラミング・Web制作) Pythonを勉強しています。 5 2023/08/25 09:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelをCSV書き出す場合のシー...
-
Perlの変数に文字数制限(容量...
-
テキストデータから指定した1...
-
ReadLineでの読み出し行を指定する
-
openした後、closeしないでプロ...
-
VBAでCSVファイルの特定行を書...
-
VBAでCSVファイルを途中行まで...
-
perlで、後ろの行を読んで、前...
-
JavaでCSVファイルを高速に読む...
-
VB6.0でDB接続する際に切断時の...
-
Excelマクロでフォルダ内のCSV...
-
VBAで巨大なファイルの途中から...
-
batファイルでrenameができませ...
-
エラー 'dir.h' : No such fi...
-
HTMLのフォームで画像と文...
-
awkスクリプトでダブルクォーテ...
-
readdir()で得られるファイル・...
-
ファイル全てを .xlsm に変更し...
-
while(<ハンドラ>) {} で行数を...
-
パスから最後のディレクトリだ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでCSVファイルの特定行を書...
-
ExcelをCSV書き出す場合のシー...
-
openした後、closeしないでプロ...
-
VBAでCSVファイルを途中行まで...
-
VBAで巨大なファイルの途中から...
-
ReadLineでの読み出し行を指定する
-
JavaでCSVファイルを高速に読む...
-
MATLAB グローバル変数の宣言
-
エクセルVBA コードが同じでも...
-
Perlの変数に文字数制限(容量...
-
perlで、後ろの行を読んで、前...
-
C言語でのファイルのデータ更...
-
2つのCSVファイルをマッチング
-
VB6.0でDB接続する際に切断時の...
-
CSVが可変長の場合の検索方法
-
perlで容量の大きいCSVファイル...
-
1ファイルずつ読み込みたい
-
VBScriptでファイル保存先のデ...
-
perl で googleAPIを呼び出す...
-
C#でCSVファイルを逐一更新したい
おすすめ情報