fgetc

(PHP 4, PHP 5)

fgetcGets character from file pointer

Description

string fgetc ( resource $handle )

Gets a character from the given file pointer.

Parameters

handle

The file pointer must be valid, and must point to a file successfully opened by fopen() or fsockopen() (and not yet closed by fclose()).

Return Values

Returns a string containing a single character read from the file pointed to by handle. Returns FALSE on EOF.

Warning

This function may return Boolean FALSE, but may also return a non-Boolean value which evaluates to FALSE. Please read the section on Booleans for more information. Use the === operator for testing the return value of this function.

Examples

Example #1 A fgetc() example

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

Notes

Note: This function is binary-safe.

See Also

  • fread() - Binary-safe file read
  • fopen() - Opens file or URL
  • popen() - Opens process file pointer
  • fsockopen() - Open Internet or Unix domain socket connection
  • fgets() - Gets line from file pointer

Коментарии

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"` ) );
2009-03-23 21:08:47
http://php5.kiev.ua/manual/ru/function.fgetc.html
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);
}

?>
2009-05-11 13:30:50
http://php5.kiev.ua/manual/ru/function.fgetc.html
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();
?>
2011-03-22 08:33:12
http://php5.kiev.ua/manual/ru/function.fgetc.html
Автор:
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);
}
2017-06-30 17:10:10
http://php5.kiev.ua/manual/ru/function.fgetc.html
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
}
?>
2018-01-29 18:57:08
http://php5.kiev.ua/manual/ru/function.fgetc.html

    Поддержать сайт на родительском проекте КГБ