fgetc

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

fgetcLiest das Zeichen, auf welches der Dateizeiger zeigt

Beschreibung

fgetc(resource $stream): string|false

Liest ein Zeichen von dem übergebenen Dateizeiger.

Parameter-Liste

stream

Der Zeiger auf eine Datei muss gültig sein und auf eine Datei verweisen, die vorher erfolgreich mit fopen() oder fsockopen() geöffnet (und nicht bereits von fclose() geschlossen) wurde.

Rückgabewerte

Gibt einen String zurück, welcher ein einzelnes Zeichen von der aktuellen Position des Dateizeigers stream enthält. Gibt false zurück, wenn der Dateizeiger am Ende der Datei steht (EOF).

Warnung

Diese Funktion kann sowohl das boolsche false zurückliefern, als auch einen nicht-boolschen Wert, welcher zu false ausgewertet wird. Weitere Informationen entnehmen Sie bitte dem Abschnitt über die boolschen Typen. Benutzen Sie deshalb den === Operator, um den Rückgabewert dieser Funktion zu überprüfen.

Beispiele

Beispiel #1 Ein fgetc()-Beispiel

<?php
$fp
= fopen('somefile.txt', 'r');
if (!
$fp) {
echo
'Konnte Datei somefile.txt nicht öffnen';
}
while (
false !== ($char = fgetc($fp))) {
echo
"$char\n";
}
?>

Anmerkungen

Hinweis: Diese Funktion ist binärsicher.

Siehe auch

  • fread() - Liest Binärdaten aus einer Datei
  • fopen() - Öffnet eine Datei oder URL
  • popen() - Öffnet einen Dateizeiger für einen Prozess
  • fsockopen() - Stellt eine Internet- oder Unix-Domain-Socket-Verbindung her
  • fgets() - Liest die Zeile von der Position des Dateizeigers

add a note add a note

User Contributed Notes 5 notes

up
10
alex at alexdemers dot me
14 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
4
ktraas at gmail dot com (Kevin Traas)
14 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
3
sfinktah at php dot spamtrak dot org
12 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
1
Anonymous
6 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);
}
up
2
seraclimov at yandex dot ru
6 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
}
?>
To Top