文件的输入和输出:流和缓冲区的概念和文件操作函数总结
流和缓冲区的概念理解
流(stream)
A stream is a source or destination of data that may be associated with a disk or other peripheral.
流(stream)是与磁盘或其它外围设备关联的数据的源或目的地。
Streams are a portable way of reading and writing data. They provide a flexible and efficient means of I/O. A Stream is a file or a physical device (e.g. printer or monitor) which is manipulated with a pointer to the stream.
流是(表达)读写数据的一种可移植的方法,它为一般的I/O操作提供了灵活有效的手段。一个流是一个由指针操作的文件或者是一个物理设备,而这个指针正是指向了这个流。
C语言中stdin、stdout、stderr分别是标准输入流、标准输出流及标准出错流
缓冲区(buffer)
缓冲区存在于流与具体的设备终端或者存储介质上的文件之间。
标准I / O提供缓存的目的是尽可能减少使用read和write调用的数量。
它也对每个I / O流自动地进行缓存管理。
标准I / O提供了三种类型的缓存:全缓存、行缓存、无缓存。
(1)全缓存。在这种情况下,当填满标准I / O缓存后才进行实际I / O操作。对于驻在磁盘上的文件通常是由标准I / O库实施全缓存的。在一个流上执行第一次I / O操作时,相关标准I / O函数通常调用malloc获得需使用的缓存。
(2)行缓存。在这种情况下,当在输入和输出中遇到新行符时,标准I / O库执行I / O操作。这允许我们一次输出一个字符(用标准I/O fputc函数),但只有在写了一行之后才进行实际I / O操作。
(3)不带缓存。标准I / O库不对字符进行缓存。如果用标准I / O函数写若干字符到不带缓存
的流中,则相当于用w r i t e系统调用函数将这些字符写至相关联的打开文件上。标准出错流stderr通常是不带缓存的,这就使得出错信息可以尽快显示出来,而不管它们是否含有一个新行字符。ANSI C要求下列缓存特征:
(1) 当且仅当标准输入和标准输出并不涉及交互作用设备时,它们才是全缓存的。
(2) 标准出错决不会是全缓存的。涉及缓冲区的一些问题: gets是一个不推荐使用的函数。问题在于调用者在使用gets时不能指定缓存的长度。这样就可能造成缓存越界(如若该行长于缓存长度),写到缓存之后的存储空间中,从而产生不可予料的后果。
刷新(flush)
缓存可由标准I / O例程自动地刷新(例如当填满一个缓存时),或者可以调用函数ff l u s h刷新一个流。
在U N I X环境中,刷新有两种意思:
在标准I / O库方面,刷新意味着将缓存中的内容写到磁盘上(该缓存可以只是局部填写的)
在终端驱动程序方面(例如t c f l u s h函数),刷新表示丢弃已存在缓存中的数据。
FILE结构体的定义
在C语言中,通过打开流来关联流及其目的地,使用的函数是fopen()
该函数返回一个指向文件的指针(FILE *),该指针包含了足够的可以控制流准确地到达目的地的信息。
将它称为流控制结构体
/* Definition of the control structure for streams */typedef struct {short level; /* fill/empty level of buffer */unsigned flags; /* File status flags */char fd; /* File descriptor */unsigned char hold; /* Ungetc char if no buffer */short bsize; /* Buffer size */unsigned char *buffer; /* Data transfer buffer */unsigned char *curp; /* Current active pointer */unsigned istemp; /* Temporary file indicator */short token; /* Used for validity checking */} FILE; /* This is the FILE object */
mode参数指令
mode参数 | 功能描述 |
---|---|
r | 以只读方式打开文件 |
w | 打开或创建文本文件只写,对已存在的文件清除原内容 |
a | 追加。打开或创建文本文件,在尾部进行写 |
rb | 以只读方式打开二进制文件 |
wb | 打开或创建二进制文件只写,对已存在的文件清除原内容 |
ab | 追加。打开或创建二进制文件,在尾部进行写 |
r+ | 打开文本文件用于更新(读和写) |
w+ | 打开或创建文本文件用于更新,对已存在的文件清除原内容 |
a+ | 追加。打开或创建文本文件用于更新,在尾部进行写 |
r+b或rb+ | 打开二进制文件用于更新 |
w+b或wb+ | 打开或创建二进制文件用于更新,对已存在的文件清除原内容 |
a+b或ab+ | 追加,打开或创建二进制文件更新,在尾部进行写 |
文件操作相关函数
fopen
FILE *fopen(const char *filename, const char *mode)
以mode指定模式打开filename指定的文件,并返回一个与之相关的流。操作失败返回NULL
FILE *fp = fopen('1.txt','r'); //以只读方式打开名为‘1.txt’的文本文件
freopen
FILE *freopen(const char *filename, const char *mode, FILE *stream)
以mode指定模式打开filename指定文件,并将文件关联到stream指定的流中,返回stream
fflush
int fflush(FILE *stream)
像它的名字一样将缓冲区的全部尚未写入文件的数据写入到文件中。错误则返回EOF,否则返回0。
fflush(NULL); //清洗所有的输出流
fclose
int fclose(FILE *stream)
将所有未写入的数据写入stream中,丢弃缓冲区中的所有未读输入数据,并释放自动分配的全部缓冲区,最后关闭流。错误则返回EOF,否则返回0。
remove
int remove(const char *filename)
删除filename指定的文件,后续试图打开该文件的操作将失败。如果删除失败返回非0值。
rename
int rename(const char *oldname,const char* *newname)
修改文件的名字。操作失败返回非0值。
tmpfile
FILE *tmpfile(void)
以模式‘wb+’创建一个临时文件,当该文件被关闭或者程序正常结束时被自动删除。如果创建成功函数返回一个流;如果创建失败则返回NULL。
tmpnam
char tmpnam(char s[L_tmpname])
tmpnam(NULL)函数创建一个与现有文件名都不相同的字符串,并返回一个指向内部静态数组的指针。
tmpnam(s)把创建的字符串保存到数组s中,并把它作为函数值返回;每次调用时生成不同的名字。
setvbuf
int setvbuf(FILE *stream, char *buf, int type, int size)
setvbuf的参数:一个指向流的指针,一个期望缓冲区的地址(buf),缓存的类型(type), 缓存区的字节大小(size)
type:
_IOFBF(满缓冲):当缓冲区为空时,从流读入数据。或者当缓冲区满时,向流写入数 据。_IOLBF(行缓冲):每次从流中读入一行数据或向流中写入一行数据。
_IONBF(无缓冲):直接从流中读入数据或直接向流中写入数据,而不设置缓冲区。
如果buf不是NULL,则setvbuf将buf所指向的区域作为缓冲区,否则将分配一个缓冲区。size决定缓冲区的长度。若出错则返回非0值。
setbuf
如果buf的值为NULL,则关闭流stream的缓冲;否则setbuf函数等价于(void)setvbuf(stream,buf,_IOFBF,BUFSIZ);
文件的输入和输出:流和缓冲区的概念和文件操作函数总结相关推荐
- C#(Csharp)笔记二十八——C# 文件的输入与输出
一丶C# 文件的输入与输出 一个 文件 是一个存储在磁盘中带有指定名称和目录路径的数据集合.当打开文件进行读写时,它变成一个 流. 从根本上说,流是通过通信路径传递的字节序列.有两个主要的流:输入流 ...
- python学习[第十四篇] 文件的输入与输出
python学习[第十四篇] 文件的输入与输出 标准文件类型 一般来说只要程序一执行,就会访问3个文件: 标准输入(键盘) stdin 标准输出(显示器缓冲区) stdout 默认输出到屏幕 标准错误 ...
- java中文件的输入和输出
以下所有对象需要关闭(close)的,都使用jdk1.7的try-with-resource来进行释放 文件的输入(读取)需要使用到: 创建一个File对象,在初始化的时候赋值一个文件路径. 创建Fi ...
- 文件格式化输入和输出
随时随地技术实战干货,获取项目源码.学习资料,请关注源代码社区公众号(ydmsq666) 在控制台操作时,使用的格式化输入和输出为scanf和printf,那么对文件的IO操作也可以使用fscanf和 ...
- c语言ord函数在哪个头文件里,第五章 文件的输入和输出
作者:村里有个男孩叫小方 1 实验目的 掌握python 操作文件的内建函数(open read write close) 2 实验目标 完成对数据的分类(有一段json数据包的.txt数据,里面有电 ...
- sqlplus操作--文件的输入与输出
再sqlplus中执行脚本sql语句,并使结果输出到ouput文件 --关闭console台输出,可以节省时间 set term off; --再输出的文件中显示执行的sql语句 set echo o ...
- ACM比赛技巧之文件数据输入与输出
#include <iostream> #include <cstdio> //freopen函数在这个文件中 using namespace std; //这里是从文件读入, ...
- c语言文件操作中fseek,ftell,rewind的用法以及文件的输入和输出以及读写
1. 为什么使用文件 我们前面学习结构体时,可以写通讯录的程序,当通讯录运行起来的时候,可以给通讯录中增加.删除数据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下次运行 ...
- python学习-文件的输入、输出
文件的输入输出 文件:数据持久化最简单的类型,也叫平面文件(flat file).它仅仅是一个文件名下的字节流,把数据从一个文件读入内存,然后从内存写入文件. 读一个文件之前需要打开它,之后可以调用函 ...
最新文章
- Proguard 部分类不混淆的技巧
- 未来人工智能客户服务的5大优势
- 数据分析与挖掘 - R语言:贝叶斯分类算法(案例三)
- springMVC--(讲解5)文件上传与传参测试
- python字典随时添加元素和值
- 倒数日怎么设置起始日_起始价131亿!杭州江河汇流区85万方综合体招标延期
- Java黑皮书课后题第2章:*2.20(金融应用:计算利息)编写程序,读取余额和年利率百分比,打印下个月的利息
- 过度扩容 A股“虚胖”
- jquery ui tabs详解(中文) 【转载】
- SharePoint2010人员搜索
- 三个数互质 java_LeetCode 5198. 丑数 III(Java)容斥原理和二分查找
- 为什么 String hashCode 方法选择数字31作为乘子?
- 完全背包问题 c语言
- 混合线性模型学习笔记2
- kindle索引_Kindle太费电?卡索引解决办法
- psv无线怎么连接电脑连接服务器,如何使用PSV远程操作电脑 PSVITA REMOTE DESKTOP详细教程...
- FastAPI 快速入门
- 桌面计算机图标怎么取消,win7图标箭头怎么取消,win7去除电脑桌面图标箭头
- 腾讯云为什么做不过阿里云?说腾讯云败了合适吗?
- 互联网行业裁员潮为什么来得这么突然?
热门文章
- Mplayer 音频解码分析
- 分享博文摘要图标【11/16更新】
- eclipse搜索框太小
- SpringBoot中的Tomcat是如何启动的
- docker中centos遇到sudo: command not found
- Flutter1.12与原生Android交互(kotlin)
- SQLServer获取最后插入生成的ID 不同方法
- JAVA高并发秒杀系统构建之——高并发优化分析
- machine id linux,linux – 机器ID是uuid吗?
- html下拉列表初始值不显示,javascript – 使用innerhtml显示下拉列表文本而不是值...