[PHP]ファイル操作:fgetc関数の使い方 – 1文字ずつ読み込むテクニック

PHP

こんにちは!今回は、PHPのfgetc関数について、基礎から応用まで詳しく解説していきます。

目次

  1. fgetc関数とは
  2. 基本的な使い方
  3. 実践的な使用例
  4. 注意点と対策
  5. パフォーマンス考慮
  6. まとめ

1. fgetc関数とは

fgetc関数は、ファイルから1文字ずつ読み込むための関数です。

string|false fgetc ( resource $handle )

戻り値:

  • 成功時:1文字の文字列
  • 失敗時またはEOF:false

2. 基本的な使い方

$handle = fopen("test.txt", "r");
while (($char = fgetc($handle)) !== false) {
    echo $char;
}
fclose($handle);

3. 実践的な使用例

文字カウント

$handle = fopen("sample.txt", "r");
$charCount = 0;

while (fgetc($handle) !== false) {
    $charCount++;
}

echo "文字数: " . $charCount;
fclose($handle);

特定の文字を検索

function findChar($filename, $searchChar) {
    $handle = fopen($filename, "r");
    $position = 0;
    $found = [];

    while (($char = fgetc($handle)) !== false) {
        if ($char === $searchChar) {
            $found[] = $position;
        }
        $position++;
    }

    fclose($handle);
    return $found;
}

// 使用例
$positions = findChar("text.txt", "a");
print_r($positions);

HTMLタグの解析

function parseHtmlTags($filename) {
    $handle = fopen($filename, "r");
    $inTag = false;
    $currentTag = "";
    $tags = [];

    while (($char = fgetc($handle)) !== false) {
        if ($char === "<") {
            $inTag = true;
            $currentTag = "";
        } elseif ($char === ">") {
            $inTag = false;
            $tags[] = $currentTag;
        } elseif ($inTag) {
            $currentTag .= $char;
        }
    }

    fclose($handle);
    return $tags;
}

4. 注意点と対策

エラーハンドリング

$handle = @fopen("file.txt", "r");
if ($handle === false) {
    throw new Exception("ファイルを開けません");
}

try {
    while (($char = fgetc($handle)) !== false) {
        // 処理
    }
} finally {
    fclose($handle);
}

マルチバイト文字の扱い

function readMbChar($handle) {
    $char = fgetc($handle);
    if (ord($char) >= 0x80) {
        // マルチバイト文字の追加バイトを読み込む
        $char .= fgetc($handle);
        $char .= fgetc($handle);
    }
    return $char;
}

5. パフォーマンス考慮

バッファリング設定

$handle = fopen("large.txt", "r");
stream_set_read_buffer($handle, 8192); // 8KBバッファ

大きなファイルの処理

function processLargeFile($filename, $callback) {
    $handle = fopen($filename, "r");
    $buffer = "";
    $count = 0;

    while (($char = fgetc($handle)) !== false) {
        $buffer .= $char;
        $count++;

        if ($count >= 1024) { // 1KB単位で処理
            $callback($buffer);
            $buffer = "";
            $count = 0;
        }
    }

    if ($buffer !== "") {
        $callback($buffer);
    }

    fclose($handle);
}

6. ユーティリティ関数

文字種類の判定

function analyzeCharTypes($filename) {
    $handle = fopen($filename, "r");
    $stats = [
        'alpha' => 0,
        'digit' => 0,
        'space' => 0,
        'other' => 0
    ];

    while (($char = fgetc($handle)) !== false) {
        if (ctype_alpha($char)) {
            $stats['alpha']++;
        } elseif (ctype_digit($char)) {
            $stats['digit']++;
        } elseif (ctype_space($char)) {
            $stats['space']++;
        } else {
            $stats['other']++;
        }
    }

    fclose($handle);
    return $stats;
}

行番号付きの表示

function displayWithLineNumbers($filename) {
    $handle = fopen($filename, "r");
    $line = 1;
    $currentLine = "";

    while (($char = fgetc($handle)) !== false) {
        if ($char === "\n") {
            echo sprintf("%4d: %s\n", $line++, $currentLine);
            $currentLine = "";
        } else {
            $currentLine .= $char;
        }
    }

    if ($currentLine !== "") {
        echo sprintf("%4d: %s\n", $line, $currentLine);
    }

    fclose($handle);
}

まとめ

fgetc関数の主なポイント:

  1. 1文字ずつ読み込める
  2. 細かい制御が可能
  3. マルチバイト文字の扱いに注意
  4. 大きなファイルの処理時はバッファリングを考慮

以上でfgetc関数の解説は終わりです。文字単位での細かい制御が必要な場合に、ぜひ活用してください!

タイトルとURLをコピーしました