PHP Conference Japan 2024

fgetc

(PHP 4, PHP 5, PHP 7, PHP 8)

fgetc从文件指针读取字符

描述

fgetc(资源 $stream): 字符串|false

从给定的文件指针读取一个字符。

参数

stream

文件指针必须有效,并且必须指向由 fopen()fsockopen() 成功打开的文件(并且尚未由 fclose() 关闭)。

返回值

返回一个字符串,其中包含从由 stream 指向的文件读取的单个字符。在 EOF 时返回 false

警告

此函数可能返回布尔值 false,但也可能返回一个计算结果为 false 的非布尔值。请阅读关于 布尔值 的部分以了解更多信息。使用 === 运算符 来测试此函数的返回值。

范例

示例 #1 fgetc() 示例

<?php
$fp
= fopen('somefile.txt', 'r');
if (!
$fp) {
echo
'Could not open file somefile.txt';
}
while (
false !== ($char = fgetc($fp))) {
echo
"$char\n";
}
?>

注释

注意: 此函数是二进制安全的。

参见

  • fread() - 二进制安全的文件读取
  • fopen() - 打开文件或 URL
  • popen() - 打开进程文件指针
  • fsockopen() - 打开互联网或 Unix 域套接字连接
  • fgets() - 从文件指针读取一行

添加注释

用户贡献的注释 5 个注释

9
alex at alexdemers dot me
15 年前
在 CLI 中仅使用 PHP 从用户获取输入的最佳和最简单的方法是将 fgetc() 函数与 STDIN 常量一起使用

<?php

echo '您确定要退出吗? (y/n) ';
$input = fgetc(STDIN);

if (
$input == 'y')
{
exit(
0);
}

?>
7
ktraas at gmail dot com (Kevin Traas)
15 年前
我正在使用命令行 PHP 创建一个交互式脚本,并希望用户输入一个字符的输入 - 作为对 Yes/No 问题的响应。在使用 fgets()、fgetc()、使用 readline()、popen() 等各种建议时遇到了一些麻烦。想出了以下方法,效果非常好

$ans = strtolower( trim( `bash -c "read -n 1 -t 10 ANS ; echo \\\$ANS"` ) );
4
sfinktah at php dot spamtrak dot org
13 年前
要在 CLI 模式下读取单个按键,您可以使用 ncurses(这可能需要 PHP 的附加模块)或使用 *nix 的“/bin/stty”命令。

<?php
function stty($options) {
exec($cmd = "/bin/stty $options", $output, $el);
$el AND die("exec($cmd) failed");
return
implode(" ", $output);
}

function
getchar($echo = false) {
$echo = $echo ? "" : "-echo";

# 获取原始设置
$stty_settings = preg_replace("#.*; ?#s", "", stty("--all"));

# 设置新的设置
stty("cbreak $echo");

# 获取字符,直到输入句点,
# 显示它们的十六进制序号值。
printf("> ");
do {
printf("%02x ", ord($c = fgetc(STDIN)));
} while (
$c != '.');

# 恢复设置
stty($stty_settings);
}

getchar();
?>
2
seraclimov at yandex dot ru
6 年前
您不能简单地打印使用多字节字符集编码的文本的单独字符;
因为 fgetc() 会将每个多字节字符拆分成它的每个字节。请考虑以下示例

<?php
$path
= 'foo/cyrillic.txt';
$handle = fopen($path, 'rb');
while (
FALSE !== ($ch = fgetc($handle))) {
$curs = ftell($hanlde);
print
"[$curs:] $ch\n";
}
/* 结果类似如下:
<
[1]: <
[2]: h
[3]: 2
[4]: >
[5]: �
[6]: �
[7]: �
[8]: �
[9]: �
[10]: �
[11]:
[12]: �
[13]: �
[14]: �
[15]: �
[16]: �
*/
?>

我认为这不是最好的方法,但这可以作为一种变通方案。
<?php
$path
= 'path/to/your/file.ext';

if (!
$handle = fopen($path, 'rb')) {
echo
"无法打开 ($path) 文件";
exit;
}

$mbch = ''; // 保留双字节西里尔字母的第一个字节
while (FALSE !== (
$ch = fgetc($handle))) {
// 检查双字节西里尔字母的标志
if (empty(
$mbch) && (FALSE !== array_search(ord($ch), Array(208,209,129)))) {
$mbch = $ch; // 保留第一个字节
continue;
}
$curs = ftell($handle);
print "
[$curs]: " . $mbch . $ch . PHP_EOL;
// 或 print "
[$curs]: $mbch$ch\n";
if (!empty(
$mbch)) $mbch = ''; // 使用后清除字节
}
?>
0
匿名用户
7年前
如果多次调用 fgetc(HANDLE),则必须先清除缓冲区,否则新行字符会获取所有不需要的字符。

while (true) {

// 清除缓冲区 - 读取所有不需要的字符
while(fgetc(STDIN) != "\n");

// 从 STDIN 获取第一个字符
$first = fgetc(STDIN);
}
To Top