CakeFest 2024: The Official CakePHP Conference

fgetc

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

fgetcDosya tanıtıcısından bir karakter döndürür

Açıklama

fgetc(resource $dt): string|false

Belirtilen dosya tanıtıcısından bir karakter döndürür.

Bağımsız Değişkenler

dt

Dosya tanıtıcısı geçerli olmalı ve fopen() veya fsockopen() tarafından başarıyla açılmış bir dosya için döndürülmüş olmalıdır (ve henüz fclose() tarafından kapatılmamış olmalıdır).

Dönen Değerler

Dosya tanıtıcısı dt ile belirtilen bir dosyadan tek bir karakter içeren bir dizge döndürür. Dosya sonuna gelindiğinde false döndürür.

Uyarı

Bu işlev mantıksal false değeriyle dönebileceği gibi false olarak değerlendirilebilecek mantıksal olmayan bir değerle de dönebilir. Bu konuda daha fazla bilgi Mantıksal Değerler bölümünde bulunabilir. Bu işlevden dönen değeri sınamak için === işleci kullanılabilir.

Örnekler

Örnek 1 - fgetc() örneği

<?php
$dt
= fopen('birdosya.txt', 'r');
if (!
$dt) {
echo
'birdosya.txt dosyası açılamadı';
}
while (
false !== ($kar = fgetc($dt))) {
echo
"$kar\n";
}
?>

Notlar

Bilginize: Bu işlev ikil dosyalarla çalışırken dosya içeriğini değiştirmez.

Ayrıca Bakınız

  • fread() - Dosyayı ikil kipte okur
  • fopen() - Bir dosya veya URL'yi açar
  • popen() - Bir süreç tanıtıcısı açar
  • fsockopen() - Bir internet veya Unix alan soketi bağlantısı açar
  • fgets() - Dosya tanıtıcısından bir satır döndürür

add a note

User Contributed Notes 5 notes

up
8
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
7
ktraas at gmail dot com (Kevin Traas)
15 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
13 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
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
}
?>
up
0
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);
}
To Top