假定文件大小不超过 8 KB,则以下代码应当能将整个文件读入一个字符串。
$fh = fopen("myfile", "rb");
$data = fread($fh, filesize("myfile"));
fclose($fh);
|
如果文件长度大于此值,则只能使用循环将其余内容读入。
备注:使用二进制数据
注意:此函数的示例已经使用了略微不同于 fopen 的参数。当处理二进制数据时,始终要记得将 b 选项包含在 fopen 中。如果跳过这一点,Microsoft® Windows® 系统可能无法正确处理文件,因为它们将以不同的方式处理新行。如果处理的是 Linux® 系统(或其他某个 UNIX® 变种),则这可能看似没什么关系。但即使不是针对 Windows 开发的,这样做也将获得良好的跨平台可维护性,并且也是应当遵循的一个好习惯。
fscanf
回到字符串处理,fscanf 同样遵循传统的 C 文件库函数。如果您不熟悉它,则 fscanf 将把字段数据从文件读入变量中。
list ($field1, $field2, $field3) = fscanf($fh, "%s %s %s");
|
此函数使用的格式字符串在很多地方都有描述(如 PHP.net 中),故在此不再赘述。可以这样说,字符串格式化极为灵活。值得注意的是所有字段都放在函数的返回值中。(在 C 中,它们都被作为参数传递。)
fgetss
fgetss 函数不同于传统文件函数并使您能更好地了解 PHP 的力量。该函数的功能类似于 fgets 函数,但将去掉发现的任何 HTML 或 PHP 标记,只留下纯文本。查看如下所示的 HTML 文件。
清单2:样例 HTML 文件
If you understand what "Cause there ain't no one for to give you no pain"
means then you listen to too much of the band America
|
然后通过 fgetss 函数过滤它。
清单3:使用 fgetss
$file_handle = fopen("myfile", "r");
while (!feof($file_handle)) {
echo = fgetss($file_handle);
}
fclose($file_handle);
|
以下是输出:
My title
If you understand what "Cause there ain't no one for to give you no pain"
means then you listen to too much of the band America
|
fpassthru 函数
无论怎样读取文件,您都可以使用 fpassthru 将其余数据转储到标准输出通道。
此外,此函数将打印数据,因此无需使用变量获取数据。
非线性文件处理:跳跃访问
当然,以上函数只允许顺序读取文件。更复杂的文件可能要求您来回跳转到文件的不同部分。这时就用得着 fseek 了。
以上示例将跳转回文件的开头。如果不需要完全返回 —— 我们可设定返回千字节 —— 然后就可以这样写:
从 PHP V4.0 开始,您有一些其他选项。例如,如果需要从当前位置向前跳转 100 个字节,则可以尝试使用:
fseek($fh, 100, SEEK_CUR);
|
类似地,可以使用以下代码向后跳转 100 个字节:
fseek($fh, -100, SEEK_CUR);
|
如果需要向后跳转至文件末尾前 100 个字节处,则应使用 SEEK_END。
fseek($fh, -100, SEEK_END);
|
在到达新位置后,可以使用 fgets、fscanf 或任何其他方法读取数据。
注:不能将 fseek 用于引用 URL 的文件处理。 |