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