对于 C/C++ 程序员。
fscanf() 的工作方式与 C/C++ 不同,因为 PHP 的 fscanf() 会隐式地将文件指针移到下一行。
(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)
fscanf — 根据格式解析来自文件中的输入
函数 fscanf() 类似于 sscanf(),但它从与 stream
关联的文件中获取输入,并根据指定的 format
解释输入。
格式字符串中的任何空格都会与输入流中的任何空格匹配。这意味着,即使格式字符串中的制表符 (\t
) 也可以匹配输入流中的单个空格字符。
每次调用 fscanf() 都从文件中读取一行。
如果只向此函数传递两个参数,则解析的值将作为数组返回。否则,如果传递了可选参数,则函数将返回已赋值值的个数。可选参数必须通过引用传递。
如果 format
中预期的子字符串数量多于 string
中可用的子字符串数量,则将返回 null
。在其他错误情况下,将返回 false
。
示例 #1 fscanf() 示例
<?php
$handle = fopen("users.txt", "r");
while ($userinfo = fscanf($handle, "%s\t%s\t%s\n")) {
list ($name, $profession, $countrycode) = $userinfo;
//... 处理这些值
}
fclose($handle);
?>
示例 #2 users.txt 内容
javier argonaut pe hiroshi sculptor jp robert slacker us luigi florist it
对于 C/C++ 程序员。
fscanf() 的工作方式与 C/C++ 不同,因为 PHP 的 fscanf() 会隐式地将文件指针移到下一行。
在 fscanf 文档中精确说明这一点将非常棒
一次函数调用读取完整的一行。
而不仅仅是格式中定义的值的数量。
如果一个文本文件包含两行,每行包含四个整数值,
使用 8 个 fscanf($fd,"%d",$v) 读取文件不会运行!
你必须做 2 个
fscanf($fd,"%d %d %d %d",$v1,$v2,$v3,$v4);
然后每行 1 个 fscanf。
如果你想读取 csv 格式或类似格式的文本文件(无论字段用什么字符分隔),你应该使用 fgetcsv()。当字段的文本为空时,fscanf() 可能会跳过它并用下一个文本填充它,而 fgetcsv() 会正确地将其视为一个空字段。
另一个读取文件并按分隔符返回记录/字符串的函数。它非常类似于 fgets(),分隔符是附加参数。跨多行工作良好。
function fgetd(&$rFile, $sDelim, $iBuffer=1024) {
$sRecord = '';
while(!feof($rFile)) {
$iPos = strpos($sRecord, $sDelim);
if ($iPos === false) {
$sRecord .= fread($rFile, $iBuffer);
} else {
fseek($rFile, 0-strlen($sRecord)+$iPos+strlen($sDelim), SEEK_CUR);
return substr($sRecord, 0, $iPos);
}
}
return false;
}
如果你想解析 cron 文件,你可以使用此模式
<?php
while ($cron = fscanf($fp, "%s %s %s %s %s %[^\n]s"))
{
}
?>
实际上,与其试图考虑文件里可能存在的每一个字符,不如排除分隔符更容易。
例如,如果你的分隔符是逗号,使用
%[^,]
代替
%[a-zA-Z0-9.| ... ]
只需确保在你的最后一个条目中使用 %[^,\n],这样就不会包含换行符。