6

这个问题就解决了。非常感谢。
我的问题和我正在使用的解决方案如下所述。

问题:

open IN, "<./test.txt";
seek(IN,10,0);
read IN, $temp, 5;

seek(IN,20,0);
close(IN);


情况是,我的句柄将从位置 0 开始。
在第一次查找功能之后,我的文件句柄将在位置 10。
读完之后,我的句柄将在位置 15。
此时,我再次查找。然后程序将从头或从位置 20 开始
搜索。我的问题是,无论如何我都可以在文件中进行搜索,这样我就不需要每次都从文件的起点搜索?


我使用的方式:

use Fcntl qw(SEEK_SET SEEK_CUR SEEK_END); #SEEK_SET=0 SEEK_CUR=1 ...

$target_byte=30;
open IN, "<./test.txt";
seek(IN,10,SEEK_SET);
read IN, $temp, 5;

$position=tell(IN);
seek(IN,$target_byte-$position,SEEK_CUR);
#do what I want
close(IN);
4

1 回答 1

29

在我们开始之前,

  • 你要求我们的假设毫无意义。第一个字节位于零位。总是。

  • 它被称为“文件句柄”(因为它允许您保留文件),而不是“文件处理程序”(因为它不处理任何内容)。

如果您使用常量 SEEK_SET、SEEK_CUR 和 SEEK_END 而不是 0、1 和 2,会更清楚。

你的代码是

use Fcntl qw( SEEK_SET );

open IN, "<./test.txt";
seek(IN,10,SEEK_SET);
read IN, $temp, 5;

seek(IN,20,SEEK_SET);
close(IN);

顾名思义,它将位置设置为指定值。

所以,

  • 第一次查找后,文件位置将为 10。
  • 之后read,文件位置将是 15。
  • 第二次查找后,文件位置为 20。

视觉上,

         +--------------------------  0: Initially.
         |         +---------------- 10: After seek($fh, 10, SEEK_SET).
         |         |    +----------- 15: After reading "KLMNO".
         |         |    |    +------ 20: After seek($fh, 20, SEEK_SET).
         |         |    |    |
         v         v    v    v     
file:    ABCDEFGHIJKLMNOPQRSTUVWXYZ
indexes: 01234567890123456789012345

如果你想相对于你当前的位置寻找,你会使用SEEK_CUR.

         +--------------------------  0: Initially.
         |         +---------------- 10: After seek($fh, 10, SEEK_CUR).
         |         |    +----------- 15: After reading "KLMNO".
         |         |    |         +- 25: After seek($fh, 10, SEEK_CUR).
         |         |    |         |
         v         v    v         v 
file:    ABCDEFGHIJKLMNOPQRSTUVWXYZ
indexes: 01234567890123456789012345
于 2013-05-15T03:43:13.417 回答