• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • fgetc()

    (PHP 4, PHP 5, PHP 7)

    从文件指针中读取字符

    说明

    fgetc(resource $handle): string

    从文件句柄中获取一个字符。

    参数

    $handle

    文件指针必须是有效的,必须指向由fopen()或fsockopen()成功打开的文件(并还未由fclose()关闭)。

    返回值

    返回一个包含有一个字符的字符串,该字符从$handle指向的文件中得到。碰到 EOF 则返回FALSE

    Warning

    此函数可能返回布尔值FALSE,但也可能返回等同于FALSE的非布尔值。请阅读布尔类型章节以获取更多信息。应使用===运算符来测试此函数的返回值。

    范例

    一个fgetc()例子

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

    注释

    Note:此函数可安全用于二进制对象。

    参见

    • fread() 读取文件(可安全用于二进制文件)
    • fopen() 打开文件或者 URL
    • popen() 打开进程文件指针
    • fsockopen() 打开一个网络连接或者一个Unix套接字连接
    • fgets() 从文件指针中读取一行
    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);
    }
    ?>
    
    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"` ) );
    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();
    ?>
    
    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
    }
    ?>
    
    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);
    }

    上篇:fflush()

    下篇:fgetcsv()