PHP 8.5.0 Alpha 2 available for testing

fgetc

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

fgetcLee un carácter en un fichero

Descripción

fgetc(resource $stream): string|false

Lee un carácter en un fichero.

Parámetros

stream

El puntero de archivo debe ser válido y apuntar a un archivo abierto con éxito por fopen() o fsockopen() (y no cerrado aún por fclose()).

Valores devueltos

Devuelve una cadena que contiene un solo carácter, leído desde el fichero apuntado por stream. Devuelve false al final del fichero.

Advertencia

Esta función puede retornar false, pero también puede retornar un valor equivalente a false. Por favor, lea la sección sobre los booleanos para más información. Utilice el operador === para probar el valor de retorno exacto de esta función.

Ejemplos

Ejemplo #1 Ejemplo con fgetc()

<?php
$fp
= fopen('somefile.txt', 'r');
if (!
$fp) {
echo
'No es posible abrir el fichero somefile.txt';
}
while (
false !== ($char = fgetc($fp))) {
echo
"$char\n";
}
?>

Notas

Nota: Esta función maneja strings binarios.

Ver también

  • fread() - Lectura del archivo en modo binario
  • fopen() - Abre un fichero o un URL
  • popen() - Crea un puntero de archivo de proceso
  • fsockopen() - Abre un socket de conexión Internet o Unix
  • fgets() - Recupera la línea actual a partir de la posición del puntero de archivo

add a note

User Contributed Notes 5 notes

up
10
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:

<?php

echo 'Are you sure you want to quit? (y/n) ';
$input = fgetc(STDIN);

if (
$input == 'y')
{
exit(
0);
}

?>
up
8
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
2
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 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
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
-2
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