標(biāo)準(zhǔn)I/O函數(shù)的優(yōu)點(diǎn)
移植性好 + 利用緩沖提高性能。
分別使用系統(tǒng)函數(shù)和標(biāo)準(zhǔn)I/O函數(shù)的例子對(duì)比(注意書(shū)中少了一個(gè)頭文件):
# gcc syscpy.c -o syscpy
# ./syscpy
# gcc stdcpy.c -o stdcpy
# ./stdcpy
后者幾乎瞬間就完成了。
標(biāo)準(zhǔn)I/O函數(shù)的缺點(diǎn)
不易進(jìn)行雙向通信(需要定義兩個(gè)FILE結(jié)構(gòu)體用于兩個(gè)方向) + 可能頻繁調(diào)用fflush函數(shù)來(lái)切換讀寫(xiě)工作狀態(tài) + 需要把套接字文件描述符轉(zhuǎn)換成FILE結(jié)構(gòu)體指針
使用標(biāo)準(zhǔn)I/O函數(shù)
#include <stdio.h>
/*
* @params
* fildes: 需要轉(zhuǎn)換的文件描述符
* mode: 要?jiǎng)?chuàng)建的FILE結(jié)構(gòu)體指針的模式信息,如"r"、"w"等
*/
File *fdopen(int fildes, const char *mode); // 成功時(shí)返回轉(zhuǎn)換的FILE結(jié)構(gòu)體指針,失敗時(shí)返回NULL
int fileno(FILE *stream); // 成功時(shí)返回轉(zhuǎn)換后的文件描述符,失敗時(shí)返回-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
基于套接字的標(biāo)準(zhǔn)I/O函數(shù)使用
flush函數(shù)的作用是讓數(shù)據(jù)立即發(fā)送,以免一直保留在緩沖區(qū)中。
# 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
習(xí)題
- 請(qǐng)說(shuō)明標(biāo)準(zhǔn)I/O函數(shù)的2個(gè)優(yōu)點(diǎn)。它為何擁有這2個(gè)優(yōu)點(diǎn)?
移植性好(兼容各操作系統(tǒng))+ 利用緩沖提高性能(合并發(fā)送數(shù)據(jù))。- 利用標(biāo)準(zhǔn)I/O函數(shù)傳遞數(shù)據(jù)時(shí),下面的想法是錯(cuò)誤的:“調(diào)用fputs函數(shù)傳輸數(shù)據(jù)時(shí),調(diào)用后立即開(kāi)始發(fā)送!”為何說(shuō)上述想法是錯(cuò)誤的?為了達(dá)到這種效果應(yīng)添加哪些處理過(guò)程?
標(biāo)準(zhǔn)I/O函數(shù)還有自己的緩沖區(qū)。需要調(diào)用fflush函數(shù)立即發(fā)送。
附錄
[1] Github