C语言 从STDIN中读取,Chicken Scheme



我知道如何(或多或少)在C中做到这一点:

#include <stdio.h>
#include <string.h>
int
main(int argc, char** argv)
{
  char buf[BUFSIZ];
  fgets(buf, sizeof buf, stdin); // reads STDIN into buffer `buf` line by line
  if (buf[strlen(buf) - 1] == 'n')
  {
    printf("%s", buf);
  }
  return 0;
}

期望的最终结果是从管道中读取STDIN(如果存在的话)。(我知道上面的代码不会这样做,但我不知道如何在从管道/heredoc读取时只执行上述操作)。

我如何在Chicken Scheme中做类似的事情?

就像我之前说的,最终目标是能够做到这一点:

echo 'a' | ./read-stdin
# a
./read-stdin << EOF
a
EOF
# a
./read-stdin <<< "a"
 # a
./read-stdin <(echo "a")
 # a
./read-stdin < <(echo "a")
 # a

我明白了

;; read-stdin.scm
(use posix)
;; let me know if STDIN is coming from a terminal or a pipe/file
(if (terminal-port? (current-input-port))
   (fprintf (current-error-port) "~A~%" "stdin is a terminal") ;; prints to stderr
   (fprintf (current-error-port) "~A~%" "stdin is a pipe or file"))
;; read from STDIN
(do ((c (read-char) (read-char)))
   ((eof-object? c))
   (printf "~C" c))
(newline)

根据Chicken wiki, terminal-port?是Chicken的相当于C的isatty()函数。

注意

上面的例子在编译时效果最好。与csi一起运行它似乎使terminal-port?总是返回true,但也许添加对(exit)和文件末尾的显式调用会导致Chicken Scheme解释器退出,从而允许STDIN成为终端以外的东西?

相关内容

  • 没有找到相关文章

最新更新