文件的概念、标准IO其一
1.文件的概念
文件是一种存储在磁盘(掉电不丢失存储设备)上,掉电不丢失的一种存储数据的方式,文件在系统中有以下层次的结构来实现。
系统调用、文件IO、标准IO的关系如下:
2.linux系统的文件分类
a.普通文件(-):ELF文件,文本文件
b.目录(d)
c.字符设备文件(c):访问字符设备
d.块设备文件(b):访问块设备
e.连接文件(l):相当于快捷方式
f.管道文件(p):用于管道通信
g.套接字文件(s):用于socket通信
3.文件缓冲区
文件缓冲区是在访问文件时不会每次操作都要去同步到访问磁盘中的文件,而是到达某种条件后才合并访问,根据同步的条件不同,文件的缓冲方式有三种:
a.全缓冲
当缓冲区满了才同步(刷新缓冲区)
b.行缓冲
当遇到换行符"\n"才同步缓冲区
c.无缓冲
没有缓冲区
标准输入、标准输出属于行缓冲,标准错误属于无缓冲,缓冲区大小在512bytes~4Kbytes之间的效率最高。
PS:printf函数会同步到缓冲区的情形(输出)
a.遇到换行符"\n"
b.程序正常结束
c.遇到scanf函数
d.缓冲区满了
e.调用了fflush函数
修改缓冲区的大小
setbuf()/setvbuf()
等价于
参数:stream 要修改缓冲区的文件
buf 缓冲区手地址
mode 缓冲区类型
size 缓冲区的大小
成功返回0,失败返回非0。
4.标准IO
标准IO属于C标准库中的关于文件操作的可函数,只要有C的环境就可以使用,文件的操作都是按照以下步骤进行:打开文件 > 操作文件 > 关闭文件。
a.打开文件 fopen函数
参数: pathname 要打开的文件路径,要用双引号括起来
mode 打开的方式
"r" - 以只读方式方式打开,文件必须存在
"r+" - 以读写方式方式打开,文件必须存在
"w" - 以只写方式方式打开,文件不存在则创建,存在则清空文件内容
"w+" - 以读写方式方式打开,文件不存在则创建,存在则清空文件内容
"a" - 以只写方式方式打开,文件不存在则创建,文件存在则在末尾追加(读写位置在文件末尾)
"a+" - 以读写方式方式打开,文件不存在则创建,文件存在则在末尾追加(读写位置在文件末尾)
fopen默认以文本方式打开,如果希望以二进制打开可以加"b"("rb+" "r+b")
成功返回文件流指针(代表一个打开的文件),失败返回NULL。
b.关闭文件 fclose函数
传入fopen的返回值
注:不再访问的文件应该关闭,在程序结束时候所有打开的文件都会被自动关闭,但是要手动关闭。
c.文件读写
1)非格式化读写
I:按字符读写 fputc/fgetc
参数:c - 要写的字符(字符数据)
stream - 要写的文件流指针
成功返回写入的字符,失败返回EOF
参数就是要读的文件流指针
成功返回读到的字符,失败或者读到末尾就返回EOF
II:按行读写 fputs/fgets
参数: s - 要写入的字符串(不包括\0)
stream - 要写的文件流指针
成功返回非0数据,失败返回EOF
读到换行符/文件结束/size-1大小 为止,在最后加上结束符
参数: s - 读文件内容存储首地址
size - s指向空间的大小
stream - 要读的文件流指针
成功返回读到的内容,失败/读到末尾返回NULL
注:从键盘读取字符串不要用scanf,而要用fgets(buf,size,stdin);
gets函数从标准输入读取字符串,但是不检查越界,不允许使用,puts函数输出字符串到标准输出,也不常用
III:按块读写 fwrrite/fread
参数: ptr - 读/写的内存地址
size - 读/写单个数据大小
nmemb - 希望读/写数据个数
stream - 读/写的文件流指针
返回成功读/写的数据个数(成功个数小于希望的个数,出错/到末尾)
如何区分读到末尾和出错 ------------- 使用ferror函数和feof函数
如果出错,ferror函数返回真
如果读到末尾,feof函数返回真
if(ferror(fp)){
//出错
}
if(feof(fp)){
//读到文件末尾
}
PS:如果有错误麻烦指出来,大家互相学习 0-0
文件的概念、标准IO其一的更多相关文章
- 文件IO和标准IO的区别【转】
一.先来了解下什么是文件I/O和标准I/O: 文件I/O:文件I/O称之为不带缓存的IO(unbuffered I/O).不带缓存指的是每个read,write都调用内核中的一个系统调用.也就是一般所 ...
- 标准IO与文件IO 的区别【转】
本文转载自:http://blog.sina.com.cn/s/blog_63f31f3401013jrn.html 先来了解下什么是标准IO以及文件IO. 标准IO:标准I/O是ANSI C建立的一 ...
- 标准IO与文件IO 的区别
先来了解下什么是标准IO以及文件IO. 标准IO:标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头文件中的定义,具有一定的可移植性.标准IO库处理很多细节.例如缓存 ...
- C5 标准IO库:APUE 笔记
C5 :标准IO库 在第三章中,所有IO函数都是围绕文件描述符展开,文件描述符用于后续IO操作.由于文件描述符相关的操作是不带缓冲的IO,需要操作者本人指定缓冲区分配.IO长度等,对设备环境要求一定的 ...
- 为什么需要标准IO缓冲?
(转)标准I/O缓冲:全缓冲.行缓冲.无缓冲 标准I/O库提供缓冲的目的是尽可能地减少使用read和write调用的次数.它也对每个I/O流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的 ...
- [APUE]标准IO库(上)
一.流和FILE对象 系统IO都是针对文件描述符,当打开一个文件时,即返回一个文件描述符,然后用该文件描述符来进行下面的操作,而对于标准IO库,它们的操作则是围绕流(stream)进行的. 当打开一个 ...
- linux标准IO缓冲(apue)
为什么需要标准IO缓冲? LINUX用缓冲的地方遍地可见,不管是硬件.内核还是应用程序,内核里有页高速缓冲,内存高速缓冲,硬件更不用说的L1,L2 cache,应用程序更是多的数不清,基本写的好的软件 ...
- UNIX高级环境编程(6)标准IO函数库 - 流的概念和操作
标准IO函数库隐藏了buffer大小和分配的细节,使得我们可以不用关心预分配的内存大小是否正确的问题. 虽然这使得这个函数库很容易用,但是如果我们对函数的原理不熟悉的话,也容易遇到很多问题. 1 ...
- 标准io与文件io
A: 代码重复: 语句块1: while(判断) { 语句块2: 语句块1: } 上面可以改写为: while(1) { 语句块1: if(判断) break: 语句块2: } B: 标准IO和文件I ...
随机推荐
- 一个Java的小问题
老师今天在讨论群里抛出了一个问题,让大家尝试思考一下他所给的一段代码输出是什么. 其代码如下: class T { void foo() { this.bar(); } void bar() { Sy ...
- CH15 面向对象程序设计
面向对象程序设计是基于三个基本概念的:数据抽象.继承和多态. 第7章介绍了数据抽象的知识,简单来说,C++通过定义自己的数据类型来实现数据抽象. 数据抽象是一种依赖于接口和实现分离的编程技术:类的设计 ...
- Linux开机流程及运行级别
启动流程: 没有运行程序的硬件除了会电人,没有别的用处.那么计算机是如何识别软件并执行的呢?下面介绍操作系统的开机启动流程: BIOS:开机时主动执行的第一个程序,会识别存储设备. MBR:第一个可开 ...
- java string常用的占位符形式
自己在这里总结了三种占位符形式:看下面代码即可 String stringFormat = "lexical error at position %s, encountered % ...
- 二、Linux目录结构&常用指令
Linux目录结构: ps -ef:任务管理器 ifconfig: 查看ip ping : 测试与目标主机的连通性,ctrl+c停止 目录指令: ll:列出当前目录下的文件信息 ls -al : 列 ...
- call 和 apply 用法
ECMAScript规范中,所有函数都包含这两个方法,并且两个方法的使用基本一致,都是用于改变函数的作用域,即改变函数体内 this 指向.不同的是 call 方法的第二个参数可以接收任意个参数,以逗 ...
- 什么是IPFS?IPFS与区块链有什么关系
1.什么是IPFS? IPFS是Inter Planetary File System(星际文件系统)的缩写,是一个典型的点对点分布式文件系统, 旨在用同一个文件系统连接所有的计算设备.这时候有些小伙 ...
- stl_map复习
set和map的底层模板是红黑树,可以有不同的键值和实值,关于增删改查,迭代器的使用都在代码里面,亲手尝试更方便记忆 #include <iostream>#include <map ...
- 51nod 1515:明辨是非 并查集合并
1515 明辨是非 题目来源: 原创 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 收藏 关注 给n组操作,每组操作形式为x y p. 当p为1时,如果第x ...
- [洛谷Luogu]P1141 01迷宫[联通块 并查集]
题目链接 大致题意 相邻格子不同为连通,计算每个点所在的连通块大小. 想法 我采用了并查集的做法. 开一个辅助数组记录连通块大小,每次合并的时候更新父亲节点的大小即可. 一个点先与它上面的点判定,若判 ...