Perlのseek関数について学びましょう

このQ&Aのポイント
  • seek関数は、ファイルハンドルの位置を移動するための関数です。
  • seek関数の引数は、ファイルハンドル、オフセット、基準位置の順です。
  • オフセットは現在の位置からの相対位置を示し、基準位置はファイルポインタの起点となる位置を指定します。
回答を見る
  • ベストアンサー

perl seek関数について

seek関数について少し質問させてください。 seek ファイルハンドル,オフセット,基準位置 と、某書籍に書いてありましたが、 オフセットのほうが元の位置で、基準位置が ファイルポインタを移動させる場所なんでしょうか? 例えば、 seek LOCK,0,2 の場合、ファイルハンドルLOCKの中のファイルポインタを0(ファイルの先頭)から2(ファイルの最後)に移動させるということでしょうか? そうであるならば、 seek LOCK,0,0 の場合、どういう意味になるのでしょう? 要点をまとめますと、ファイルハンドル以後の二つの数値の関係が今ひとつつかめていないということになります。 宜しくお願い致します。

  • shevy
  • お礼率67% (703/1046)
  • CGI
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.2

No.1のarukamunです。 >seek LOCK,10,2 >というのは、 >基準位置2、つまりファイルの終わりから、 >10バイトのところに移動する >ということになりますよね? ファイルの終わりから+10バイトの所へ移動できません。また、前に戻る事もありません。 恐らくエラーになって0を返すと思います。 オフセット値はマイナス値も指定できますので、前に戻りたければ seek LOCK,-10,2 の様に指定します。

shevy
質問者

お礼

ありがとうございます。 なるほど、常に後方へしか移動しないということなんですね。 非常によくわかりました。 これでなんとかseek関数が使えそうです。 ご丁寧にありがとうございました。

その他の回答 (1)

  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.1

seek ファイルハンドル, オフセット, 基準位置 ここで基準位置なのですが、 0, 1, 2の3通りしかありません。 0:ファイルの先頭から 1:現在のファイルポインタから 2:ファイルの終わりから ですね。 オフセットはその基準の位置からどれだけずらすか、もしくはずれているかですね。 seek LOCK,0,2 ファイルポインタLOCKをファイルの終わりから0バイトの所に移動(変更)する。 seek LOCK,0,0 ファイルポインタLOCKをファイルの先頭から0バイトの所に移動(変更)する。 要するに、基準位置を基準にして、オフセット分移動した所を指すという事です。 お解り頂けましたでしょうか。

shevy
質問者

お礼

ありがとうございます。 となりますと、 seek LOCK,10,2 というのは、 基準位置2、つまりファイルの終わりから、 10バイトのところに移動する ということになりますよね? その場合、ファイルの終わりから前方向に戻るということでしょうか? 基準位置が0の場合は、後ろ方向、つまり右に進むということになるのでしょうか?

関連するQ&A

  • 大容量のファイルをseek関数で操作したい。

    教えててください。 OSは、Turbo Linuxです。 現在、大容量のファイルを操作するのに、標準関数で行おうと思っています。 seek関数を使用する場合、先頭からの位置を指定しようとするとint型の位置(符号付4バイト)になるので、容量とすると、1.9GBが限界になると思います。 しかし、扱いたいファイルの容量は、もっと大容量(200GB以上)になるので、「シークできないのでは?」と思いました。 大容量のファイルを扱う方法は、標準関数以外に何かあるのでしょうか?それとも、駆使して操作するのでしょうか?

  • EOFの書き込み Perl

    CGI初心者です。質問させてもらいます。 テキストファイルを読み書きモードでオープンします。 open(FILE, "+<test.txt"); 読み込みや書き込み作業をした後、 現在のファイルポインタの位置や、 seek FILE, 0, 0; などファイルの先頭で、 EOFを書き込めないのでしょうか? 例)print FILE 'EOFの文字'; Cでは出来たような気がしましたが・・ ファイルポインタの位置でファイルを終わらせる 簡単な方法ありましたら、お教え願います。m(__)m

    • ベストアンサー
    • CGI
  • 標準出力上でのファイルポインタの扱いで困っています。

    標準出力上でのファイルポインタの扱いで困っています。 簡単な例で説明すると、 下のプログラムはファイル内で、一秒ごとに左から順に1を0で置き換えていくもので正常に動作します。 open(F, '+< temp'); print F "11111111111111111111111111111111\n"; for(0..31){ seek(F, $_, 0); print F '0'; sleep(1); } close(F); 同様のことが標準出力でも可能かと思って以下のようにしてみたのですが、うまくいきません。 open(STDOUT, '+<'); print STDOUT "11111111111111111111111111111111\n"; for (0..31){ seek(STDOUT, $_, 0); print STDOUT '0'; sleep(1); } close(STDOUT); } 2つ目の例では動作を見るかぎり、ファイルポインタは1111.....の先頭からのオフセットではなく、その次の行(空行)の先頭からのオフセットとなっているように見えます。つまり古い行には戻れていないようです。 Seek()は標準出力上では使えないのでしょうか?

    • ベストアンサー
    • Perl
  • 【MFC】CFileでSeekした位置から値出力したい

    【MFC】CFileでSeekした位置から値出力したい 環境:WindowsXP(SP2)、VisualStudio2005、MFC CFileの「open」を利用して、ファイルをオープンし、 (この時の指定モードはCFile::modeCreate | CFile::modeNoTruncate | CFile::modeWriteです) 指定した位置にseekし、そこへCFileの「Write」で書き込みを行っています。 Seek位置を「SeekToEnd()」で最後へ移動した際は問題ないのですが、途中へSeekし、書き込みを行った際に、そこから上書きされてしまいます。 「挿入」という形で途中にデータを書き込む方法は無いでしょうか? ※特にMFCにこだわっているわけではないので、何かご存知の方がおられましたらご教授お願いいたしますm(__)m

  • 先頭からバイトの位置と は

    まだCGIを学びはじめたばかりの初心者です。よろしくお願いします。 アクセスカウンター作成の中でseek関数がでてきたのですが、書籍の説明が上手く理解できずにいます。 「オフセットは基準からの位置をバイト数で指定します。」とあるのですが、ここでいうバイト数で指定 とはどういう意味でしょうか? (ここのバイト数で指定 という事がどういうことなのか上手く理解できずにいるので、基準とオフセットの関係性もよくわからないでいます。) ここでいうバイト数とはどういう事なのか、ご解説やアドバイスなどをいただけたらと思います。よろしくお願いします。

    • ベストアンサー
    • CGI
  • テキストファイルの読み込みとファイルポインタについて質問です。

    テキストファイルの読み込みとファイルポインタについて質問です。 最近PHPを勉強し始めました。 fgets()とfseek()についてわからないことがあるので教えて頂けないでしょうか。 現状以下のテキストとPHPファイルを用意しています。 PHPに2行目のbを表示させたいのですが、思ったように表示をさせることができません。 fgets()は"現在のファイルポインタから次の1行を取得" fseek()は"ファイルポインタを指定したバイト数分移動する"と調べてわかりました。 この二つを使って2行目を指定してbを表示したいのですがうまく表示されて困っています。 test.phpのコメントの★の部分がわからない箇所になります。 おそらく根本的な考え方が間違っていると思うのですが…いろいろ調べたのですがわかりませんでした。 申し訳ありませんがご教授願えないでしょうか。 ----------------- new.txt ----------------- a b c d e ----------------- ----------------- test.php ----------------- <?PHP $new_file = 'new.txt'; $fpt = fopen($new_file,'r'); // ファイルオープン直後のポインタ位置 echo '現在の位置=行指定'.ftell($fpt).'<br>'; print fgets($fpt).'<br>'; // ポインタを5進める fseek($fpt,5); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ポインタの位置確認 print fgets($fpt).'<br>'; // ★ここでeを表示したい // 現在の位置からポインタを3戻す fseek($fpt,-3,SEEK_CUR); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ★行指定が5-3なので2に…ならないです。 print fgets($fpt).'<br>'; // ポインタを先頭へ rewind($fpt); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ポイントが先頭にきたか確認 print fgets($fpt).'<br>'; // ポインタを最後へ fseek($fpt,0,SEEK_END); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ★new.txtはabcdeの5行なので5になると思いきや18に… print fgets($fpt).'<br>'; fclose($fpt); // ファイルを閉じる ?> ----------------- ----------------- 実行結果 ----------------- 現在の位置=行指定0 a 現在の位置=行指定5 現在の位置=行指定3 b 現在の位置=行指定0 a 現在の位置=行指定18

    • ベストアンサー
    • PHP
  • VB.NETでファイル操作

    ファイルをオープンしたまま、ファイル内のデータを何度も読み込みたいのですが、Seekで読み込み位置を先頭にし、Peekでループさせ、一度全部読み込み終わった後、Seek文で先頭に戻し、再度ファイルの先頭から読み込ませようと思ったのですができません。 なぜなのでしょうか? // ファイルオープン StreamReader sr = new StreamReader( (System.IO.Stream) File.OpenRead("C:\\Temp\\Test.txt"), System.Text.Encoding.ASCII); // 最後まで読み出す sr.BaseStream.Seek(0, SeekOrigin.Begin); while (sr.Peek() > -1) { Console.WriteLine(sr.ReadLine()); } // もう一度 sr.BaseStream.Seek(0, SeekOrigin.Begin); while (sr.Peek() > -1) {         ←このWhileの中に入らない。 Console.WriteLine(sr.ReadLine()); } // ファイルクローズ sr.Close();

  • rewind

    rewindという関数はfseekでファイルポインタを先頭に移動するのと何が違いますか?

    • ベストアンサー
    • PHP
  • ある書籍で、見つけました、perlのソースについて

    ある書籍で、見つけました、perlのソースについて 疑問がありまして、お尋ねします。 ※下記は、perl/cgiソースの一部です。 ある書籍で見つけたものです。 >require 'cgi-lib.pl'; >&ReadParse(¥%test); 私は、(%test)だと思っているのですが。 ()の中の、先頭に「¥」を付けることに、どのような意味 があるのでしょうか >$test = $test{'test'}; 仮に、$testの値が「"<&>"」だったとしまして、以下 をごらん頂きたいのですが、 >open(ファイルハンドル,$fname) >while(<ファイルハンドル>){ >$test =~ s/¥"/¥&quot¥;/g; 私の認識では、「s/"/&quot;/g;」ではと思うのですが、 「¥」はどのような意味なのでしょうか 以下、3行も同じ疑問です。 >$test =~ s/&/\&testmp\;/g; >$test =~ s/¥</¥&lt¥;/g; >$test =~ s/¥>/¥&gt¥;/g; >print $_; >} 書籍で上記のソースを見たのですが、 HTMLのフォームのテキストボックスに、「"<&>"」と入力し submitボタンで、上記コードを含む、cgiを開きます。 そして、「"<&>"」を受取っても正しく、置換し、 cgiから、HTML($fname)を開くプログラムです。 置換後のHTMLファイルには、「"<&>"」と表示されます。 以上、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 文字(キー)入力中に、入力位置が飛んでしまう

    WindouwsXPで Word、Exel等を使っています。 Exelであるセルに入力しているとき突然、マウスポインタがある位置に飛んでしまいます。 今、これを書いているときも同じ現象が生じています。 :::具体的には、この質問の2行目の文入力の場合 exel de aru seru ni nyuuryoku site irutoki ...... とキーを押しているわけですが 未確定状態途中突然マウスポインタをおいてある行の先頭のところに入力ポインタが移動してしまいます。いまもマウスがこのウィンドウの4行目の位置の右端にあるのですが、<:::具体的には、  >の :::の前に入力位置が飛んでしまいます。 しょっちゅうおきて困っています。

専門家に質問してみよう