fgetc

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

fgetcPrende un carattere da un puntatore a file

Descrizione

fgetc(resource $handle): string

Restituisce una stringa contenente un singolo carattere letto dal file puntato da handle. Restituisce false alla fine del file (EOF).

Il puntatore al file deve essere valido, e deve puntare ad un file aperto con successo da fopen() o fsockopen() (e non ancora chiuso da fclose()).

Avviso

Questa funzione può restituire il Booleano false, ma può anche restituire un valore non-Booleano valutato come false. Fare riferimento alla sezione Booleans per maggiori informazioni. Usare l'operatore === per controllare il valore restituito da questa funzione.

Example #1 Un esempio per fgetc()

<?php
$fp
= fopen('somefile.txt', 'r');
if (!
$fp) {
echo
'Non si riesce ad aprire il file somefile.txt';
}
while (
false !== ($char = fgetc($fp))) {
echo
"$char\n";
}
?>

Nota: Questa funzione è binary-safe (gestisce correttamente i file binari)

Vedere anche fread(), fopen(), popen(), fsockopen() e fgets().

add a note

User Contributed Notes 5 notes

up
11
alex at alexdemers dot me
16 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:<?phpecho 'Are you sure you want to quit? (y/n) ';$input = fgetc(STDIN);if ($input == 'y'){    exit(0);}?>
up
3
seraclimov at yandex dot ru
7 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 letterswhile (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
7
ktraas at gmail dot com (Kevin Traas)
16 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
4
sfinktah at php dot spamtrak dot org
14 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
0
Anonymous
8 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);}
To Top