fgetc
(PHP 4, PHP 5)
fgetc — Считывает символ из файла
Описание
Функция возвращает строку, содержащую один символ, прочитанный из файла, на который указывает handle . Возвращает FALSE по достижению конца файла (EOF).
Дескриптор должен указывать на файл, открытый ранее с помощью функции fopen(), popen() или fsockopen().
Указатель на файл должен быть корректным и указывать на файл, успешно открытый функциями fopen() или fsockopen().
Эта функция может возвращать как логическое значение FALSE, так и не относящееся к логическому типу значение, которое приводится к FALSE, например, 0 или "". За более подробной информации обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.
Пример #1 Пример использования функции fgetc()
<?php
$fp = fopen('somefile.txt', 'r');
if (!$fp) {
echo 'Ошибка при открытии файла somefile.txt';
}
while (false !== ($char = fgetc($fp))) {
echo "$char\n";
}
?>
Замечание: Эта функция безопасна для обработки данных в двоичной форме.
См.также описания функций fread(), fopen(), popen(), fsockopen() и fgets().
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Расширения для работы с файловой системой
- Функции для работы с файловой системой
- basename
- chgrp
- chmod
- chown
- clearstatcache
- copy
- delete
- dirname
- disk_free_space
- disk_total_space
- diskfreespace
- fclose
- feof
- fflush
- fgetc
- fgetcsv
- fgets
- fgetss
- file_exists
- file_get_contents
- file_put_contents
- file
- fileatime
- filectime
- filegroup
- fileinode
- filemtime
- fileowner
- fileperms
- filesize
- filetype
- flock
- fnmatch
- fopen
- fpassthru
- fputcsv
- fputs
- fread
- fscanf
- fseek
- fstat
- ftell
- ftruncate
- fwrite
- glob
- is_dir
- is_executable
- is_file
- is_link
- is_readable
- is_uploaded_file
- is_writable
- is_writeable
- lchgrp
- lchown
- link
- linkinfo
- lstat
- mkdir
- move_uploaded_file
- parse_ini_file
- parse_ini_string
- pathinfo
- pclose
- popen
- readfile
- readlink
- realpath_cache_get
- realpath_cache_size
- realpath
- rename
- rewind
- rmdir
- set_file_buffer
- stat
- symlink
- tempnam
- tmpfile
- touch
- umask
- unlink
Коментарии
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"` ) );
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);
}
?>
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();
?>
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);
}
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
}
?>