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


    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结构体指针)

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

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

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

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

    2.2 文件操作函数

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

    只写方式打开

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

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

    w+

    可读写方式打开

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

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

    a

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

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

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

    a+

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

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

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

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

    打开文件:

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

    读字符串:

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

    写字符串:

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

    刷新(清空)缓冲区:

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

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

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

    1. int feof(FILE* stream);
    2. 如果结束则为0
    3. 没结束则非0
  • 相关阅读:
    三台centos7部署redis6.2版本集群
    RPC框架
    【规则】Adblock Plus 广告过滤规则自用整理
    Istio Arch-Overview
    基于设计模式的绘图程序设计(大二下学期课程设计)
    kaggle电子邮件分类xgboost建模可视化模型评估混淆矩阵范例
    顶象无感验证为十八数藏“加固城墙”
    Spread for ASP.NET 15.2 个性化需求中文版
    leetcode522. 最长特殊序列 II(java)
    普林斯顿微积分读本05第四章--求解多项式的极限问题
  • 原文地址:https://blog.csdn.net/A_ns_wer_/article/details/133123683