#include <unistd.h> #include <stdio.h> #include <stdlib.h> #define BUFFSIZE 4096 int main(void) { int n; char buf[BUFFSIZE]; while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0) if (write(STDOUT_FILENO, buf, n) != n) printf("write error\n"); exit(1); if (n < 0) printf("write error\n"); exit(0); }
运行结果
[lingh@test advanced_unix]$ in2out
rrrrrrrrrrrrrrrrrrrrrrr
rrrrrrrrrrrrrrrrrrrrrrr
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
rrrrrrrrrrrrrrrrrrrrrrr
rrrrrrrrrrrrrrrrrrrrrrr
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
知识点:
read() write() STDIN_FILENO STDOUT_FILENO 在头文件unistd.h中
read 返回读得字节数 到达文件尾端 read返回0, 发生错误返回-1
open read write lseek close 提供了不用缓存的IO,这些函数都使用文件描述符
STDIN_FILENO是文件描述符,与stdin的差别, stdin是FILE* 类型的在头文件stdio.h中
stdio.h 写道
extern struct _IO_FILE *stdin; /* Standard input stream. */
extern struct _IO_FILE *stdout; /* Standard output stream. */
extern struct _IO_FILE *stderr; /* Standard error output stream. */
extern struct _IO_FILE *stdout; /* Standard output stream. */
extern struct _IO_FILE *stderr; /* Standard error output stream. */
#include <stdio.h> #include <stdlib.h> int main(void) { int c; while ((c = getc(stdin)) != EOF) if (putc(c, stdout) == EOF) printf("output error\n"); exit(1); if (ferror(stdin)) printf("input error\n"); exit(0); }
运行结果:
[lingh@test advanced_unix]$ gcc -o getc2putc getc2putc.c
[lingh@test advanced_unix]$ getc2putc
3333333333333333
3333333333333333
5555555555555555555
5555555555555555555
^C
[lingh@test advanced_unix]$ getc2putc
3333333333333333
3333333333333333
5555555555555555555
5555555555555555555
^C
知识点
1. stdin stdout EOF getc putc ferror 在stdio.h中
#ifndef EOF
# define EOF (-1)
#endif
# define EOF (-1)
#endif