C语言文件I/O和标准I/O函数
读取/写入 相对于文件而言
输入/输出 相对于程序/内存而言
一切皆文件,键盘、显示屏也是文件,只不过是特殊的标准文件;
标准文件:标准输入、标准输出、标准错误;---->对应的文件指针:stdin、stdout、stderr;--->键盘、显示器
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
二进制与文本:
大家都知道计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。简单来说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码。)
参考链接:
文本文件与二进制文件的区别: https://www.cnblogs.com/pengwangguoyh/articles/3223072.html
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
标准I/O的机理:
研究一个典型的概念模型,分析标准I/O的工作原理。
调用fopen()打开文件(C程序会自动打开3中标准文件)。fopen()函数不仅打开一个文件,还创建了一个缓冲区(读写模式下会创建两个缓冲区)以及一个包含文件和缓冲区数据的结构。fopen()返回一个指向该结构的指针,以便其他函数知道如何找到该结构。
假设如果把该指针赋给一个指针变量fp,我们说fopen()函数“打开一个流”。如果以文本的形式打开该文件,就获得一个文本流。如果以二进制形式打开该文件,就获得一个二进制流。
这个结构通常包含一个指定流中当前位置的文件位置指示器。除此之外,它还包含错误和文件结尾指示器、一个指向缓冲区开始处的指针、一个文件标识符、一个计数(实际拷贝进缓冲区的字节数)。
第二步就是调用定义在stdio.h中的输入函数,文件中的数据块就被拷贝到缓冲区中。缓冲区的大小因实现而异。一般是512字节或是它的倍数。除了填充缓冲区外,这些输入函数还要设置fp所指向的结构中的值。尤其是设置流中的当前位置和拷贝进缓冲区的字节数。这个步骤叫做初始化结构和缓冲区。
之后按要求从缓冲区读取数据。在它读取数据时,文件位置指示器被设置为指向刚读取字符的下一个字符。由于stdio.h系列的所有输入函数都使用相同的缓冲区,所以调用任何一个函数都将从上一次函数停止调用的位置开始。
当输入函数发现已经读完缓冲区中的所有字符时,会请求把下一个缓冲区大小的数据块从文件拷贝到该缓冲区中。以这种方式,输入函数可以读取文件中所有的内容,直到文件结尾。函数在读取缓冲区中的最后一个字符后,把结尾指示器设置为真。于是,下一次被调用的输入函数将返回EOF。
输出函数以类似的方式把数据写入缓冲区。当缓冲区被填满时,数据将被拷贝至文件中。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
何为文件指针:
在C语言中使用一个指针变量指向一个文件,这个指针被称为文件指针。
定义一个文件指针: FILE *指针变量标识符
FILE应该为大写,它实际上是系统定义的一个结构。编写程序时,不必关系结构的实现细节。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
标准I/O函数总览:
fopen()函数:打开文件;(文件)
fclose()函数:关闭文件;(文件)
getc()函数:从指定文件读取一个字符;(字符)
putc()函数:写入一个字符到指定文件;(字符)
getchar()函数:从标准输入文件读取一个字符;(字符)
putchar()函数:写入一个字符到标准输入文件;(字符)
fprintf()函数:写入到指定文件,输出到文件、带转换说明;(字符串)
fscanf()函数:从指定文件读取,输入到程序、带转换说明;(字符串)
printf()函数:写入到标准输出文件,输出到标准输出文件,带转换说明;(字符串)
scanf()函数:从标准输入文件读取,从标准输入文件输入到程序,带转换说明;(字符串)
fgets()函数:从指定文件读取字符串,带字符串大小参数;(字符串)
fputs()函数:写入字符串到指定文件,带字符串大小参数;(字符串)
gets()函数:这个函数不安全,容易造成内存溢出,被摒弃了;(字符串)
puts()函数:写入字符串到标准输出设备,输出字符串到标准输出设备;(字符串)
fseek()函数:设置文件指针stream的位置;(文件)
ftell()函数:得到文件位置指针当前位置相对于文件首的偏移字节数;(文件)
fsetpos()函数:设置文件指针stream的位置,对于大文件;(文件)
fgetpos()函数:得到文件位置指针当前位置相对于文件首的偏移字节数,对于大文件;(文件)
fread()函数:二进制方式,从一个文件读数据到另一文件;(二进制)
fwrite()函数:二进制方式,从一个文件写输入到另一个文件;(二进制)
exit()函数:退出程序,返回操作系统用的。exit(0)表示正常退出,exit(x)(x不为0)都表示异常退出,这个x是返回给操作系统(包括UNIX,Linux,和MS DOS)的,以供其他程序使用。
rewind()函数:void rewind(FILE * stream);用于将文件指针重新指向文件的开头。
setvbuf()函数:创建了一个供标准I/O函数替换使用的缓冲区。
fflush()函数:引起输出缓冲区所有未写入的数据被发送到fp指定的输出文件。这个过程被称为刷新缓冲区。(针对输出流)
feof()函数:表明是否是文件结尾,0代表是文件结尾;(文件)
ferror()函数:表明是否读写错误,0代表正确读写;(文件)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
函数
函数原型
参数说明
返回值
说明
C语言文件I/O和标准I/O函数的更多相关文章
- C语言文件输入/输出 ACM改进版(用freopen函数方便检验)
这次用到的文件打开函数不再是fopen,而是stdio.h中包含的另一个函数freopen FILE * freopen ( const char * filename,const char * mo ...
- c++ 网络编程(七) LINUX下 socket编程 基于套接字的标准I/O函数使用 与 fopen,feof,fgets,fputs函数用法
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9614820.html 一.标准I/O 1,什么是标准I/O?其实是指C语言里的文件操作函数,如 ...
- c语言文件读写操作总结
C语言文件读写操作总结 C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程 ...
- 不可或缺 Windows Native (10) - C 语言: 文件
[源码下载] 不可或缺 Windows Native (10) - C 语言: 文件 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 文件 示例cFile.h #ifn ...
- C语言---文件
1. 需要了解的概念 包括:数据流.缓冲区.文件类型.文件存取方式 1.1 数据流: 指程序与数据的交互是以流的形式进行的.进行C语言文件的存取时,都会先进行“打开文件”操作,这个操作就是在打开数据流 ...
- [转]C语言文件输入/输出ACM改进版(freopen函数)
C语言文件输入/输出ACM改进版(freopen函数) 2009年5月27日 10:379,457 浏览数发表评论阅读评论 文章作者:姜南(Slyar) 文章来源:Slyar Home (www. ...
- C语言文件操作函数
C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * str ...
- Linux系统编程(1)——文件与I/O之C标准I/O函数与系统调用I/O
Linux系统的I/O也就是一般所说的低级I/O--操作系统提供的基本IO服务,与os绑定,特定于Linux平台.而标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头 ...
- Linux 文件操作——系统调用和标准I/O库
一.什么是文件 在讲述文件操作之前,我们首先要知道什么是文件.看到这个问题你可能会感觉到可笑,因为对于用过计算机的人来说,文件是最简单不过的概念了,例如一个文本是一个文件,一个work文档是一个文件等 ...
随机推荐
- C#高级参数out的使用
C#中有三个高级参数,分别是out,ref,params.本文章中先来介绍out参数的使用. out,用于在方法中返回多余值.(可以理解为让一个方法返回不同的类型值) 我们通过例子来理解例子的功能:用 ...
- JSON 解析出错问题
从 PHP 返回一段 JSON 数据给前台页面,但使用 eval 和 JSON.parse 解析都出错. 在网上那上在线的 json 解析工具解析都正确. 于是一段段删除测试,最终发现问题出在 \r\ ...
- bzoj 2653 middle(主席树)
题面:https://vjudge.net/problem/HYSBZ-2653 博客:https://blog.csdn.net/litble/article/details/78984846 这个 ...
- 205. Isomorphic Strings两个数组变形记,是否符合规则
[抄题]: Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the ...
- 【Boost】boost库获取格式化时间
获取时间方式 格式一:YYYYMMDD #include<iostream> #include<string> #include<boost/date_time/greg ...
- php学习笔记-超级全局变量
超级全局变量,超级在哪里呢?相对于global类型的变量,超级全局变量的作用域是没有限制的,函数外.函数内.随便一个PHP文件都可以引用超级全局变量.在PHP中有很多超级全局变量, 常用的有_SERV ...
- 3DPDF是个什么东西?
就是可以把3D模型放入到PDF中,然后客户可以直接用adobe reader查看这个PDF.经过搜索发现,大多数PDF编辑软件都没有直接把3D模型插入到PDF中的功能. 很多是3D软件自身提供的,比如 ...
- 数字图像处理实验(2):PROJECT 02-02, Reducing the Number of Gray Levels in an Image 标签: 图像处理MATLAB 2017-
实验要求: Reducing the Number of Gray Levels in an Image Objective To understand how the number of gray ...
- R: 基本的数学运算
################################################### 问题:基本数学运算 18.4.30 R语言用于初等数学的计算,都怎么表示??加减乘除.余数. ...
- Django rest framework之序列化小结
最近在DRF的序列化上踩过了不少坑,特此结合官方文档记录下,方便日后查阅. [01]前言 serializers是什么?官网是这样的”Serializers allow complex d ...