UNIXシステムコール 高水準入出力(getc,putchar) ファイルから読んで画面に表示する

#include <stdio.h>
#include <stdlib.h>

#define INFILE "abc.txt"

int main(void) {
  FILE *fp;
  int c;

  if ((fp = fopen(INFILE, "r")) == NULL) {
    perror("fopen");
    exit(1);
  }

  while ((c = getc(fp)) != EOF) {
    putchar(c);
  }

  if ((fclose(fp)) == EOF) {
    perror("fclose");
    exit(1);
  }

  return 0;
}
$ cat abc.txt 
abc
$ od -tx1 abc.txt 
0000000 61 62 63 0a
0000004

GDBによるデバッグ

10	  if ((fp = fopen(INFILE, "r")) == NULL) {
(gdb) n
15	  while ((c = getc(fp)) != EOF) {
(gdb) p *fp
$44 = {_flags = -72539000, _IO_read_ptr = 0x0, _IO_read_end = 0x0, _IO_read_base = 0x0, 
  _IO_write_base = 0x0, _IO_write_ptr = 0x0, _IO_write_end = 0x0, _IO_buf_base = 0x0, 
  _IO_buf_end = 0x0, _IO_save_base = 0x0, _IO_backup_base = 0x0, _IO_save_end = 0x0, 
  _markers = 0x0, _chain = 0x7ffff7f9c680 <_IO_2_1_stderr_>, _fileno = 3, _flags2 = 0, 
  _old_offset = 0, _cur_column = 0, _vtable_offset = 0 '\000', _shortbuf = "", 
  _lock = 0x555555559340, _offset = -1, _codecvt = 0x0, _wide_data = 0x555555559350, 
  _freeres_list = 0x0, _freeres_buf = 0x0, __pad5 = 0, _mode = 0, 
  _unused2 = '\000' <repeats 19 times>}
(gdb) n
16	    putchar(c);
(gdb) p/c c
$45 = 97 'a'
(gdb) p fp->_IO_read_ptr
$46 = 0x555555559491 "bc\n"
(gdb) p fp->_IO_read_end
$47 = 0x555555559494 ""
(gdb) p fp->_IO_read_base
$48 = 0x555555559490 "abc\n"
(gdb) n
15	  while ((c = getc(fp)) != EOF) {
(gdb) 
16	    putchar(c);
(gdb) p/c c
$49 = 98 'b'
(gdb) p fp->_IO_read_ptr
$50 = 0x555555559492 "c\n"
(gdb) n
15	  while ((c = getc(fp)) != EOF) {
(gdb) 
16	    putchar(c);
(gdb) p/c c
$51 = 99 'c'
(gdb) p fp->_IO_read_ptr
$52 = 0x555555559493 "\n"
(gdb) n
15	  while ((c = getc(fp)) != EOF) {
(gdb) 
16	    putchar(c);
(gdb) p/c c
$53 = 10 '\n'
(gdb) p fp->_IO_read_ptr
$54 = 0x555555559494 ""
(gdb) n
abc
15	  while ((c = getc(fp)) != EOF) {
(gdb) 
19	  if ((fclose(fp)) == EOF) {
(gdb) p/c c
$55 = -1 '\377'
(gdb) p fp->_IO_read_ptr
$56 = 0x555555559490 "abc\n"