标准I/O函数的优点
移植性好 + 利用缓冲提高性能。
分别使用系统函数和标准I/O函数的例子对比(注意书中少了一个头文件):
# gcc syscpy.c -o syscpy
# ./syscpy
# gcc stdcpy.c -o stdcpy
# ./stdcpy
后者几乎瞬间就完成了。
标准I/O函数的缺点
不易进行双向通信(需要定义两个FILE结构体用于两个方向) + 可能频繁调用fflush函数来切换读写工作状态 + 需要把套接字文件描述符转换成FILE结构体指针
使用标准I/O函数
#include <stdio.h>
/*
* @params
* fildes: 需要转换的文件描述符
* mode: 要创建的FILE结构体指针的模式信息,如"r"、"w"等
*/
File *fdopen(int fildes, const char *mode); // 成功时返回转换的FILE结构体指针,失败时返回NULL
int fileno(FILE *stream); // 成功时返回转换后的文件描述符,失败时返回-1
# gcc desto.c -o desto
# ./desto
# cat news.txt
Network C programming
# gcc todes.c -o todes
# ./todes
First file descriptor: 3
Second file descriptor: 3
# cat news.txt
Network C programming
基于套接字的标准I/O函数使用
flush函数的作用是让数据立即发送,以免一直保留在缓冲区中。
# gcc echo_stdserv.c -o estdserv
# ./estdserv 9190
Connected client 1
# gcc echo_stdclnt.c -o estdclnt
# ./estdclnt 127.0.0.1 9190
Connected
Input message (Q to quit): Deer
Message from server: Deer
Input message (Q to quit): Tiger
Message from server: Tiger
Input message (Q to quit): q
习题
- 请说明标准I/O函数的2个优点。它为何拥有这2个优点?
移植性好(兼容各操作系统)+ 利用缓冲提高性能(合并发送数据)。- 利用标准I/O函数传递数据时,下面的想法是错误的:“调用fputs函数传输数据时,调用后立即开始发送!”为何说上述想法是错误的?为了达到这种效果应添加哪些处理过程?
标准I/O函数还有自己的缓冲区。需要调用fflush函数立即发送。
附录
[1] Github