PHP 8.4.23 Released!

fgetc

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

fgetc从文件指针中读取字符

说明

function fgetc(resource $stream): string |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() - 打开 Internet 或者 Unix 套接字连接
  • fgets() - 从文件指针中读取一行

发现了问题?

了解如何改进此页面提交拉取请求报告一个错误
+添加备注

用户贡献的备注 5 notes

up
9
ktraas at gmail dot com (Kevin Traas)
17 years ago
I was using command-line PHP to create an interactive script and wanted the user to enter just one character of input - in response a Yes/No question. Had some trouble finding a way to do so using fgets(), fgetc(), various suggestions using readline(), popen(), etc. Came up with the following that works quite nicely:
$ans = strtolower( trim( `bash -c "read -n 1 -t 10 ANS ; echo \\\$ANS"` ) );
up
10
alex at alexdemers dot me
17 years ago
The best and simplest way to get input from a user in the CLI with only PHP is to use fgetc() function with the STDIN constant:
<?php
echo 'Are you sure you want to quit? (y/n) ';
$input = fgetc(STDIN);
if ($input == 'y')
{
 exit(0);
}
?>
up
4
sfinktah at php dot spamtrak dot org
15 years ago
To read a single key-press in CLI mode, you can either use ncurses (which will probably require additional modules for PHP) or get nasty with the *nix "/bin/stty" command)
<?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";
 # Get original settings
 $stty_settings = preg_replace("#.*; ?#s", "", stty("--all"));
 # Set new ones
 stty("cbreak $echo");
 # Get characters until a PERIOD is typed, 
 # showing their hexidecimal ordinal values.
 printf("> ");
 do {
 printf("%02x ", ord($c = fgetc(STDIN)));
 } while ($c != '.');
 # Return settings
 stty($stty_settings);
 }
 getchar();
?>
up
1
seraclimov at yandex dot ru
8 years ago
You can't just simple print separated characters of a text which is encoded in multibyte character set like this;
Because fgetc() will break each multibyte character on its every byte. Consider this example: 
<?php
$path = 'foo/cyrillic.txt';
$handle = fopen($path, 'rb');
while (FALSE !== ($ch = fgetc($handle))) {
 $curs = ftell($hanlde);
 print "[$curs:] $ch\n";
}
/* The result will be something like this:
<
[1]: <
[2]: h
[3]: 2
[4]: >
[5]: �
[6]: �
[7]: �
[8]: �
[9]: �
[10]: �
[11]: 
[12]: �
[13]: �
[14]: �
[15]: �
[16]: �
*/ ?>

I don't think this is the best, but it can be a workaround:
<?php
$path = 'path/to/your/file.ext';
if (!$handle = fopen($path, 'rb')) {
 echo "Can't open ($path) file';
 exit;
}
$mbch = ''; // keeps the first byte of 2-byte cyrillic letters
while (FALSE !== ($ch = fgetc($handle))) { 
 //check for the sign of 2-byte cyrillic letters 
 if (empty($mbch) && (FALSE !== array_search(ord($ch), Array(208,209,129)))) {
 $mbch = $ch; // keep the first byte
 continue;
 }
 $curs = ftell($handle);
 print "[$curs]: " . $mbch . $ch . PHP_EOL;
 // or print "[$curs]: $mbch$ch\n";
 if (!empty($mbch)) $mbch = ''; // erase the byte after using
}
?>
up
-2
Anonymous
9 years ago
If you call fgetc(HANDLE) multiple times you must clear buffer before, thus get all unwanted chars to the new new line character.
while (true) {
 //clear buffer - read all unwanted characters
 while(fgetc(STDIN) != "\n");
 
 //get first character from STDIN
 $first = fgetc(STDIN);
}
+添加备注

AltStyle によって変換されたページ (->オリジナル) /