这个问题解决了.非常感谢你.
我的问题和我正在使用的解决方案如下所述.
题:
open IN, "<./test.txt";
seek(IN,10,0);
read IN, $temp, 5;
seek(IN,20,0);
close(IN);
Run Code Online (Sandbox Code Playgroud)
情况是,我的句柄将从位置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);
Run Code Online (Sandbox Code Playgroud)
ike*_*ami 25
在我们开始之前
你要求我们没有意义的假设.第一个字节位于零位.总是.
它被称为"文件句柄"(因为它允许您保留文件),而不是"文件处理程序"(因为它不处理任何事情).
如果使用常量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);
Run Code Online (Sandbox Code Playgroud)
顾名思义,它将位置设置为指定值.
所以,
read,文件位置将为15.在视觉上,
+-------------------------- 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
Run Code Online (Sandbox Code Playgroud)
如果你想寻找相对于你现在的位置,你会使用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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15606 次 |
| 最近记录: |