rewind() 函数用于将文件指针重置到文件的开头。它会将文件位置指示器设置到文件流的开头,以便可以重新读取文件内容。
这个函数常用于需要多次读取同一个文件内容的场景,或者在写入文件后需要重新读取文件内容时。
fopen() 打开的文件资源有效,不能用于 URL 或标准输入/输出。
rewind ( resource $handle ) : bool
参数说明:
$handle:文件指针,必须是有效的、由 fopen() 打开的资源(必需)| 参数 | 描述 |
|---|---|
handle |
文件指针资源。必需参数。
|
truefalse,通常是由于以下原因:
读取文件内容后重置指针重新读取:
<?php
// 打开文件
$file = fopen("example.txt", "r");
if ($file) {
// 第一次读取
echo "第一次读取:<br>";
while (!feof($file)) {
echo fgets($file) . "<br>";
}
// 重置文件指针到开头
rewind($file);
// 第二次读取
echo "<br>第二次读取(重置后):<br>";
while (!feof($file)) {
echo fgets($file) . "<br>";
}
fclose($file);
} else {
echo "无法打开文件";
}
?>
使用 rewind() 与 ftell()、fseek():
<?php
$file = fopen("data.txt", "r+");
if ($file) {
// 读取前10个字节
$content = fread($file, 10);
echo "读取的内容: " . $content . "<br>";
// 获取当前位置
$position = ftell($file);
echo "当前位置: " . $position . "<br>";
// 重置指针
rewind($file);
// 再次获取位置
$newPosition = ftell($file);
echo "重置后位置: " . $newPosition . "<br>";
// 写入数据到文件开头
fwrite($file, "New data at start");
// 重置指针并读取
rewind($file);
echo "文件内容: " . fread($file, filesize("data.txt"));
fclose($file);
}
?>
多次读取并处理文件内容:
<?php
function processFile($filename) {
$file = fopen($filename, "r");
if (!$file) {
return false;
}
// 第一次:统计行数
$lineCount = 0;
while (!feof($file)) {
fgets($file);
$lineCount++;
}
echo "文件行数: " . $lineCount . "<br>";
// 重置指针
rewind($file);
// 第二次:统计单词数
$wordCount = 0;
while (!feof($file)) {
$line = fgets($file);
$words = str_word_count($line);
$wordCount += $words;
}
echo "单词总数: " . $wordCount . "<br>";
// 重置指针
rewind($file);
// 第三次:显示内容
echo "<h4>文件内容:</h4>";
while (!feof($file)) {
echo fgets($file) . "<br>";
}
fclose($file);
return true;
}
processFile("document.txt");
?>
正确处理 rewind() 可能出现的错误:
<?php
// 尝试打开文件
$file = @fopen("nonexistent.txt", "r");
if ($file) {
// 尝试重置指针
if (rewind($file)) {
echo "指针重置成功";
} else {
echo "指针重置失败";
}
fclose($file);
} else {
echo "文件打开失败,无法使用 rewind()";
}
echo "<br><br>";
// 正确的错误处理示例
$filename = "test.txt";
if (file_exists($filename)) {
$file = fopen($filename, "r");
if ($file) {
// 进行一些读取操作
fread($file, 100);
// 重置指针
if (rewind($file)) {
echo "指针重置成功,可以重新读取文件";
} else {
echo "指针重置失败";
// 检查错误
$error = error_get_last();
if ($error) {
echo ": " . $error['message'];
}
}
fclose($file);
} else {
echo "无法以读取模式打开文件";
}
} else {
echo "文件不存在";
}
?>
处理 CSV 文件时使用 rewind():
<?php
// 处理 CSV 文件
$csvFile = fopen("data.csv", "r");
if ($csvFile) {
// 读取并显示所有数据
echo "<h4>CSV 文件内容:</h4>";
echo "<table border='1'>";
while (($row = fgetcsv($csvFile)) !== false) {
echo "<tr>";
foreach ($row as $cell) {
echo "<td>" . htmlspecialchars($cell) . "</td>";
}
echo "</tr>";
}
echo "</table>";
// 重置指针
rewind($csvFile);
// 再次读取,只显示特定列
echo "<h4>仅显示第一列:</h4>";
while (($row = fgetcsv($csvFile)) !== false) {
if (!empty($row[0])) {
echo htmlspecialchars($row[0]) . "<br>";
}
}
fclose($csvFile);
}
?>
rewind() 函数的工作原理如下:
文件内容: [A][B][C][D][E][F][G][H][I][J]
指针位置: ↑ (文件开头)
读取3个字节后: [A][B][C][D][E][F][G][H][I][J]
指针位置: ↑ (第4个字节)
调用 rewind() 后: [A][B][C][D][E][F][G][H][I][J]
指针位置: ↑ (重置到文件开头)
<?php
// 演示执行流程
$file = fopen("test.txt", "r");
echo "1. 打开文件,指针位置: " . ftell($file) . "<br>";
fread($file, 5);
echo "2. 读取5字节后,指针位置: " . ftell($file) . "<br>";
rewind($file);
echo "3. 调用rewind()后,指针位置: " . ftell($file) . "<br>";
fclose($file);
?>
<?php
function safeRewind($handle) {
if (!is_resource($handle)) {
return false;
}
// 检查资源类型(简化检查)
$resourceType = get_resource_type($handle);
if ($resourceType !== 'stream') {
return false;
}
// 获取当前模式
$meta = stream_get_meta_data($handle);
$mode = $meta['mode'];
// 检查是否可读
if (strpos($mode, 'r') === false &&
strpos($mode, '+') === false) {
return false;
}
// 执行 rewind
return rewind($handle);
}
// 使用示例
$file = fopen("data.txt", "r");
if ($file && safeRewind($file)) {
echo "安全地重置了文件指针";
// 继续处理文件...
fclose($file);
} else {
echo "无法重置文件指针";
}
?>
| 函数 | 描述 | 与 rewind() 的区别 |
|---|---|---|
rewind() |
重置文件指针到开头 | 总是移动到文件开头(位置0) |
fseek($handle, 0) |
移动文件指针到指定位置 | 可以移动到任何位置,fseek($handle, 0) 等同于 rewind() |
ftell() |
返回当前指针位置 | 只读取位置,不修改 |
fopen() |
打开文件并返回句柄 | 创建新的文件资源,指针在开头 |
fclose() |
关闭文件句柄 | 释放资源,之后不能使用 rewind() |
文件指针操作流程:
fopen() → [文件打开,指针在位置0]
↓
fread()/fwrite() → [指针移动]
↓
ftell() → [获取当前位置]
↓
rewind() → [重置到位置0]
↓
fseek() → [移动到特定位置]
↓
fclose() → [关闭文件]
<?php
function analyzeLogFile($logFile) {
$handle = fopen($logFile, "r");
if (!$handle) return false;
// 第一次:统计总行数
$totalLines = 0;
while (!feof($handle)) {
fgets($handle);
$totalLines++;
}
rewind($handle);
// 第二次:查找错误
$errorLines = [];
$lineNumber = 0;
while (!feof($handle)) {
$line = fgets($handle);
$lineNumber++;
if (strpos($line, "ERROR") !== false) {
$errorLines[] = [
'line' => $lineNumber,
'content' => trim($line)
];
}
}
rewind($handle);
// 第三次:获取最近10行
$recentLines = [];
$allLines = file($logFile);
$recentLines = array_slice($allLines, -10);
fclose($handle);
return [
'total_lines' => $totalLines,
'errors' => $errorLines,
'recent' => $recentLines
];
}
?>
<?php
function updateConfigFile($filename, $key, $value) {
$file = fopen($filename, "r+");
if (!$file) return false;
// 读取现有内容
$content = fread($file, filesize($filename));
// 更新配置
$pattern = "/^{$key}=.*$/m";
$replacement = "{$key}={$value}";
if (preg_match($pattern, $content)) {
// 键存在,更新
$newContent = preg_replace($pattern, $replacement, $content);
// 重置指针,清空文件
rewind($file);
ftruncate($file, 0);
// 写入新内容
fwrite($file, $newContent);
} else {
// 键不存在,追加
fseek($file, 0, SEEK_END);
fwrite($file, PHP_EOL . $replacement);
}
fclose($file);
return true;
}
?>