PHP fgetc 函数
最后修改于 2025 年 4 月 3 日
PHP 的 fgetc 函数从文件指针读取单个字符。它适用于逐字符处理文件,而不是逐行处理。
基本定义
fgetc 函数一次从打开的文件中读取一个字符。它将文件句柄作为唯一参数,并返回字符。
语法:fgetc(resource $stream): string|false。该函数以字符串形式返回字符,在到达文件末尾 (EOF) 或发生错误时返回 false。它是二进制安全的。
基本的 fgetc 示例
这展示了 fgetc 最简单的用法,即逐个字符地读取文件。
basic_fgetc.php
<?php
declare(strict_types=1);
$file = fopen('example.txt', 'r');
if ($file === false) {
die('Error opening file');
}
while (($char = fgetc($file)) !== false) {
echo $char;
}
fclose($file);
此代码打开一个文件并逐个字符地读取,直到文件末尾。每个字符都会立即回显。循环会一直持续到 fgetc 返回 false。
计算特定字符
此示例计算特定字符在文件中出现的次数。
count_chars.php
<?php
declare(strict_types=1);
function countCharInFile(string $filename, string $target): int {
$file = fopen($filename, 'r');
if ($file === false) {
throw new RuntimeException("Could not open file");
}
$count = 0;
while (($char = fgetc($file)) !== false) {
if ($char === $target) {
$count++;
}
}
fclose($file);
return $count;
}
$count = countCharInFile('example.txt', 'a');
echo "The letter 'a' appears $count times";
这演示了使用 fgetc 进行字符分析。该函数在顺序读取文件时计算特定字符的出现次数。
处理二进制数据
fgetc 可以一次读取一个字节的二进制文件。
binary_read.php
<?php
declare(strict_types=1);
$file = fopen('image.png', 'rb');
if ($file === false) {
die('Error opening file');
}
$header = '';
for ($i = 0; $i < 8; $i++) {
$char = fgetc($file);
if ($char === false) break;
$header .= sprintf('%02X ', ord($char));
}
fclose($file);
echo "PNG header bytes: $header";
此代码读取 PNG 文件的前 8 个字节,并以十六进制显示它们。'rb' 模式确保在所有平台上都能正确进行二进制读取。
逐字符比较文件
此示例使用 fgetc 逐个字符地比较两个文件。
file_compare.php
<?php
declare(strict_types=1);
function compareFiles(string $file1, string $file2): bool {
$handle1 = fopen($file1, 'r');
$handle2 = fopen($file2, 'r');
if ($handle1 === false || $handle2 === false) {
throw new RuntimeException("Could not open files");
}
$pos = 0;
while (true) {
$char1 = fgetc($handle1);
$char2 = fgetc($handle2);
if ($char1 === false && $char2 === false) {
break; // Both files ended
}
if ($char1 !== $char2) {
fclose($handle1);
fclose($handle2);
return false;
}
$pos++;
}
fclose($handle1);
fclose($handle2);
return true;
}
$result = compareFiles('file1.txt', 'file2.txt');
echo $result ? 'Files are identical' : 'Files differ';
此代码逐个字符地比较两个文件。它在第一次出现差异时返回 false,如果文件相同则返回 true。位置计数器跟踪文件差异的位置。
读取直到特定字符
此示例读取文件,直到找到特定的分隔符字符。
read_until.php
<?php
declare(strict_types=1);
function readUntil(string $filename, string $delimiter): string {
$file = fopen($filename, 'r');
if ($file === false) {
throw new RuntimeException("Could not open file");
}
$result = '';
while (($char = fgetc($file)) !== false) {
if ($char === $delimiter) {
break;
}
$result .= $char;
}
fclose($file);
return $result;
}
$content = readUntil('data.txt', "\n");
echo "First line: $content";
此代码从文件中读取字符,直到遇到指定的分隔符。这对于解析以特殊字符分隔部分的结构化文件很有用。
最佳实践
- 错误处理:始终检查 fopen 是否成功。
- 资源管理:完成操作后使用 fclose 关闭文件。
- 性能:对于大文件,请考虑缓冲读取。
- 二进制安全:二进制文件请使用 'rb' 模式。
- 内存:对于大文件,fgetc 内存效率很高。
来源
本教程介绍了 PHP 的 fgetc 函数,并通过实际示例展示了其在不同场景下的用法。
作者
列出 所有 PHP 文件系统函数。