[C++ 网络协议] 套接字和标准I/O

本文详细探讨了标准I/O函数的优点,如良好的移植性和性能提升,以及其缺点如双向通信限制和flush需求。还介绍了如何通过fdopen和fileno进行文件描述符转换,以及常用的文件操作和流控制函数如fgets、fputs和fflush。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 标准I/O函数的优缺点

优点一:标准I/O函数具有良好的移植性。

为了支持所有系统,标准I/O函数都是按照标准来定义的。适用于所有编程领域。

优点二:标准I/O函数可以利用缓冲提高性能。

使用标准I/O函数会得到额外的缓冲支持,当创建套接字时,操作系统将会生成一个用于I/O的缓冲,同时,当你使用标准I/O函数,将会得到另一缓冲的支持。

得到另一缓冲的支持为什么可以提高性能?

答:并非所有情况下,都能提高性能。需要传输的数据越多,则有无缓冲带来的性能差异越大。从如下两个角度来说,另一缓冲提高了性能:

1.传输的数据量

2.数据向输出缓冲移动的次数

你每write一次,就会将数据移动到套接字的输出缓冲一次,这样

缺点一:不容易进行双向通信

缺点二:有时可能频繁的调用fflush函数

因为缓冲的缘故,每次对文件切换读写工作状态,都需要调用fflush函数。

缺点三:需要以FILE结构体指针的形式返回文件描述符

因为创建套接字时,返回的是文件描述符,但是要使用I/O函数则必须是FILE结构体指针。

2.使用标准I/O函数

2.1 fdopen函数(将文件描述符转换为FILE结构体指针)

#include<stdio.h>

FILE* fdopen(
int files,        //文件描述符
const char* mode  //将要创建的FILE结构体指针的模式信息("w"写,"R"读)
);
成功返回转移的FILE结构体指针,
失败返回NULL

注意:转移后的FILE结构体指针,可以使用fclose关闭文件,此时无需再使用close函数关闭文件描述符。

2.2 fileno函数(将FILE结构体指针转换为文件描述符)

#include<stdio.h>

int fileno(FILE* stream);
成功返回转换后的文件描述符
失败返回-1

2.2 文件操作函数

#include<stdio.h>

FILE* fopen(
const char* path,        //文件名或路径
const char* mode,        //将要创建的FILE结构体指针的模式信息
);
成功返回要打开的文件指向的FILE结构体指针
失败返回NULL
mode含义
r只读方式打开,文件必须存在
w

只写方式打开

若文件存在,则会先清空文件,再进行写。

若文件不存在,则会创建文件

w+

可读写方式打开

若文件存在,则会先清空文件,再进行写。

若文件不存在,则会创建文件

a

只写方式打开,以附加方式

若文件存在,则会将数据写入到文件末尾。(EOF符会保留)

若文件不存在,则会创建文件

a+

可读写方式打开,以附加方式

若文件存在,则会将数据写入到文件末尾。(原来的EOF符不保留)

若文件不存在,则会创建文件

wb只写打开或新建一个二进制文件
wb+读写打开或建立一个二进制文件
ab附加方式打开一个二件事文件,可以在文件末尾写
ab+读写方式打开一个二进制文件,可以在文件末尾写
  • +号表示对文件既可读又可写
  • t表示打开文件类型是文本文件
  • a表示追加原文件数据,而不是覆盖
  • b表示以二进制打开文件

打开文件:

FILE* fopen(const char* path,const char* mode);
成功则返回指向的FILE结构体
失败返回NULL

读字符串:

char* fgets(const void* buffer, size_t size, FILE* stream);
成功,该函数返回相同的 str 参数。
失败,则返回NULL

写字符串:

int fputs(const void* buffer, FILE* stream);
成功返回一个非负值
失败则返回 EOF(-1)

刷新(清空)缓冲区:

int fflush(FILE* stream);
成功返回0。指定的流没有缓冲区或者只读打开时也返回0值。
失败返回EOF。

注意:fflush在清空标准IO函数提供的缓冲区时,也会将缓冲区里的数据立马发送出去。

判断流上的文件是否结束:

int feof(FILE* stream);
如果结束则为0
没结束则非0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值