PHP 日本大会 2024

fscanf

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

fscanf根据格式解析来自文件中的输入

描述

fscanf(资源 $stream, 字符串 $format, 混合 &...$vars): 数组|整数|false|null

函数 fscanf() 类似于 sscanf(),但它从与 stream 关联的文件中获取输入,并根据指定的 format 解释输入。

格式字符串中的任何空格都会与输入流中的任何空格匹配。这意味着,即使格式字符串中的制表符 (\t) 也可以匹配输入流中的单个空格字符。

每次调用 fscanf() 都从文件中读取一行。

参数

stream

一个文件系统指针 资源,通常使用 fopen() 创建。

format

string 的解释格式,在 sprintf() 的文档中有描述,但存在以下差异

  • 函数不依赖区域设置。
  • FgGb 不受支持。
  • D 代表十进制数。
  • i 代表具有基数检测的整数。
  • n 代表到目前为止处理的字符数。
  • s 在任何空格字符处停止读取。
  • * 代替 argnum$ 来抑制此转换规范的赋值。

vars

可选的赋值值。

返回值

如果只向此函数传递两个参数,则解析的值将作为数组返回。否则,如果传递了可选参数,则函数将返回已赋值值的个数。可选参数必须通过引用传递。

如果 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

参见

  • fread() - 二进制安全的文件读取
  • fgets() - 从文件指针获取一行
  • fgetss() - 从文件指针获取一行并去除 HTML 标签
  • sscanf() - 根据格式解析来自字符串的输入
  • printf() - 输出格式化字符串
  • sprintf() - 返回格式化字符串

添加注释

用户贡献的注释 7 条注释

yasuo_ohgaki at hotmail dot com
23 年前
对于 C/C++ 程序员。

fscanf() 的工作方式与 C/C++ 不同,因为 PHP 的 fscanf() 会隐式地将文件指针移到下一行。
Bertrand dot Lecun at prism dot uvsq dot Fr
17 年前
在 fscanf 文档中精确说明这一点将非常棒
一次函数调用读取完整的一行。
而不仅仅是格式中定义的值的数量。

如果一个文本文件包含两行,每行包含四个整数值,
使用 8 个 fscanf($fd,"%d",$v) 读取文件不会运行!
你必须做 2 个
fscanf($fd,"%d %d %d %d",$v1,$v2,$v3,$v4);

然后每行 1 个 fscanf。
eugene at pro-access dot com
22 年前
如果你想读取 csv 格式或类似格式的文本文件(无论字段用什么字符分隔),你应该使用 fgetcsv()。当字段的文本为空时,fscanf() 可能会跳过它并用下一个文本填充它,而 fgetcsv() 会正确地将其视为一个空字段。
worldwideroach at hotmail dot com
19 年前
另一个读取文件并按分隔符返回记录/字符串的函数。它非常类似于 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;
}
nico at nicoswd dot com
11 年前
如果你想解析 cron 文件,你可以使用此模式

<?php

while ($cron = fscanf($fp, "%s %s %s %s %s %[^\n]s"))
{

}

?>
loco.xxx at gmail dot com
18年前
要包含所有类型的可见字符,你应该尝试

<?php fscanf($file_handler,"%[ -~]"); ?>
robert at NOSPAM dot NOSPAM
22 年前
实际上,与其试图考虑文件里可能存在的每一个字符,不如排除分隔符更容易。

例如,如果你的分隔符是逗号,使用

%[^,]

代替

%[a-zA-Z0-9.| ... ]

只需确保在你的最后一个条目中使用 %[^,\n],这样就不会包含换行符。
To Top