fgetc()
(PHP 4, PHP 5, PHP 7)
从文件指针中读取字符
说明
fgetc(resource $handle): string
从文件句柄中获取一个字符。
参数
- $handle
文件指针必须是有效的,必须指向由fopen()或fsockopen()成功打开的文件(并还未由fclose()关闭)。
返回值
返回一个包含有一个字符的字符串,该字符从$handle指向的文件中得到。碰到 EOF 则返回FALSE
。
Warning此函数可能返回布尔值
FALSE
,但也可能返回等同于FALSE
的非布尔值。请阅读布尔类型章节以获取更多信息。应使用===运算符来测试此函数的返回值。
范例
一个fgetc()例子
<?php $fp = fopen('somefile.txt', 'r'); if (!$fp) { echo 'Could not open file somefile.txt'; } while (false !== ($char = fgetc($fp))) { echo "$char\n"; } ?>
注释
Note:此函数可安全用于二进制对象。
参见
fread()
读取文件(可安全用于二进制文件)fopen()
打开文件或者 URLpopen()
打开进程文件指针fsockopen()
打开一个网络连接或者一个Unix套接字连接fgets()
从文件指针中读取一行
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); } ?>
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"` ) );
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(); ?>
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 } ?>
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); }