ZetCode

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";

此代码从文件中读取字符,直到遇到指定的分隔符。这对于解析以特殊字符分隔部分的结构化文件很有用。

最佳实践

来源

PHP fgetc 文档

本教程介绍了 PHP 的 fgetc 函数,并通过实际示例展示了其在不同场景下的用法。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 PHP 文件系统函数