文件的输入和输出:流和缓冲区的概念和文件操作函数总结

流和缓冲区的概念理解

  • 流(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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python利用有道词典翻译_使用Python从有道词典网页获取单词翻译

从有道词典网页获取某单词的中文解释。import reimport urllibwordraw_input(input a word\n)urlhttp://dict.youdao.com/search?q%s%wordcontenturllib.urlopen(url)patternre.compile("",re.DOTALL)resultpattern.search(content.read()).group()pattern2re.compi…

java学习(2):学生管理系统2

这是继续修改后的代码,亲测可用 增加一个二位数组存储数据 import java.util.; public class student { public static void main(String[] args){ //存储学生人数 Scanner in new Scanner(System.in); System.out.println(“请输入学生人数:”); //存储…

[BZOJ1444]有趣的游戏(AC自动机+矩阵乘法)

n个等长字符串,机器会随机输出一个字符串(每个字母出现的概率为p[i]),问每个字符串第一个出现的概率是多少。 显然建出AC自动机,套路地f[i][j]表示i时刻位于节点j的概率。 构建转移矩阵,当i为某个子串结束节…

web前端开发——HTML学习

WEB前端开发 W3C学习网站 MDN学习网站 HTML 从语义角度&#xff0c;描述页面结构 语言不区分大小写&#xff0c;特殊字符要求全小写 html5文件结构 快速编辑&#xff1a;Tab键 <!DOCTYPE html> 文档类型&#xff1a;符合HTML5标准 <htmml lang"en"&…

python群发短信脚本_python实现zabbix发送短信脚本

本文实例为大家分享了zabbix发送短信的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下使用方法./sendSMS.py PHONE_NUMBER args_2 SMS_MSG接收参数输入参数一: 接收手机号(zabbix传来的第1个参数&#xff0c;报警接收手机号)&#xff0c;第一个参数可以对比发送邮件的…

java学习(3):学生管理系统3

总计分为六次修改&#xff0c;代码可直接拿出来用&#xff0c;建立一个类即可&#xff0c;注意类名同步 解决总分平均分问题 import java.util.*; public class student { public static void main(String[] args){ //存储学生人数 Scanner in new Scanner(System.in); System…

第二次作业重交

一、项目简介 1、Gitee项目地址&#xff1a;https://gitee.com/xnsy/WC 2、开发语言&#xff1a;C#语言 3、解题思路 刚看完作业要求后&#xff0c;只知道这个程序要完成对文件的统计工作&#xff0c;但是对于程序设计仍然是一头雾水&#xff0c;而后百度了怎么编写wordcount程…

2021/1/18

在家宅了两天&#xff0c;寒假立的flag不能就这样倒了&#xff0c;今天开始学数据结构和算法还有前端开发&#xff0c;不然我连寒假作业都写不完QAQ。

java学习(4):第一个java程序

1第一个java文件 编写一个.java后缀的文件 public class helloworld{ public static void main(String[] args){ System.out.println(“helloworld”); } } 2cmd 编译java javac helloworld 生成class文件使用 Java helloworld 输出helloworld结束 个人练习 public class test…

python单元测试的应用_单元测试pythongui应用程序的推荐方法是什么?

我目前愚蠢到试图为Python桌面应用程序维护两个并行代码基&#xff0c;一个使用PyGObject introspection for GTK 3&#xff0c;另一个使用PyGTK for GTK 2。我主要在PyGObject分支上工作&#xff0c;然后将变更移植到PyGTK分支上。由于这些实现之间的所有细微差异&#xff0c;…

洛谷P2480 [SDOI2010]古代猪文(卢卡斯定理+中国剩余定理)

传送门 好吧我数学差的好像不是一点半点…… 题目求的是$G^{\sum_{d|n}C^d_n}mod\ 999911659$ 我们可以利用费马小定理$a^{k}\equiv a^{k\ mod\ (p-1)}(mod\ p)$ 然后组合数可以直接用Lucas搞 那么就做完啦 然而$p-1$并不是质数orz&#xff0c;费马小定理不能用 那么我们考虑把…

java学习(5):全局变量和局部变量

public class qulitity{ static int num125; public static void main(String[] args){ System.out.println(“全局变量的值为”num1); int num212; System.out.println(num2); Test(); } public static void Test(){ int num21000; System.out.println(num2); } }

C语言知识点笔记完全整理

这个大长篇相当于是自己对于c语言学习的一个总结&#xff0c;会持续更新完善。 后续会在寒假整理一些经典的例题附带题解&#xff0c;当然希望我学到的东西、总结的经验&#xff0c;能够给后来者提供一个更好的学习途径&#xff0c;从入门到精通而不再是放弃。 也欢迎读者提出…

ajax 微信code获取_获取链接的参数,判断是否是微信打开,ajax获取数据

//获取链接参数function GetQueryString(name) {var reg new RegExp("(^|&)" name "([^&]*)(&|$)");var r window.location.search.substr(1).match(reg);if (r ! null) return unescape(r[2]); return null;}function is_weixin() {var u…

[HAOI2016]食物链

题目描述 如图所示为某生态系统的食物网示意图&#xff0c;据图回答第1小题现在给你n个物种和m条能量流动关系&#xff0c;求其中的食物链条数。物种的名称为从1到n编号M条能量流动关系形如a1 b1a2 b2a3 b3......am-1 bm-1am bm其中ai bi表示能量从物种ai流向物种bi,注意单独的…

java学习(6):数据类型

public class Shortdata{ public static void main(String[] args){ byte by 45; short sho 32767; System.out.println(“sho的值是”sho); //获取最大值 System.out.println(Byte.MAX_VALUE); System.out.println(Short.MAX_VALUE); //获取最小值System.out.println(Byte.M…

Xcode添加pch文件

1.打开Xcode工程. 在Supporting Files目录下,选择 File > New > File > iOS > Other > PCH File 然后点击下一步&#xff1b; 2.如果项目名称为Demo, PCH 文件的名字为Test.pch,然后创建&#xff1b;3.选择 PCH 文件创建Test.pch文件4.找到 Project > Build …

共轭方式怎么判断_怎样判断共轭双烯

本章重点共轭二烯烃的结构,共轭二烯烃的性质及制法,共轭 效应及其相对强弱。 本章难点共轭二烯烃的结构和性质,共轭效应及其相对强弱,周 环反应及共振论的概念。 ...第六章 烯烃 共轭二烯烃 1 分类 命名 6.1.1二烯烃的分类 二烯烃包括...6-3 共轭二烯烃 一. 二烯烃的分类、命名…

java学习(7):巩固练习

//任务1 //使用记事本或其他文本编辑器编写一个java控制台程序&#xff0c;定义一个包含main方法的java类&#xff0c;在main方法中使用合适的数据类型定义如下局部变量&#xff0c;标识符要严格遵守java规范。 //学生姓名&#xff1b;学生年龄&#xff1b;学生身高&#xff0c…

js fn无法访问,不报错

GD_List.prototype.test function(){}无法访问&#xff0c;浏览器console不报错。 附带条件&#xff1a; 1.其它某些fn能访问。 2.test是放在某些fn中的。 错误原因&#xff1a;fn命名冲突&#xff08;存放test&#xff09;&#xff0c;js调用了另外一个同名fn&#xff08;没存…