c文件操作整理
《c陷阱与缺陷》
FILE *fp;
fp = fopen(file, "r+");
编程者也许认为,程序一旦执行上述操作完毕,就可以自由地进行读取和写入的操作了。遗憾的是,事实总难遂人所愿,为了保持与过去不能同时进行读写操作的程序的向下兼容性,一个输入操作不能随后直接紧跟输出操作,反之亦然。如果同时进行输入和输出操作,必须在其中插入fseek函数调用。
这个陷阱把我坑了一把,所以将c库函数文件操作学习整理一番,方便自己以后查阅。
- FILE结构体
在stdio.h中定义的FILE结构体。
#ifndef _FILE_DEFINED
struct _iobuf {
char *_ptr; //文件输入下一个位置
int _cnt; //当前缓冲区相对位置
char *_base; //文件起始位置
int _flag; //文件标志
int _file; //文件描述符
int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取
int _bufsiz; //缓冲区大小
char *_tmpfname; //临时文件名
};
typedef struct _iobuf FILE;
#define _FILE_DEFINED
#endif
- 文件的打开
FILE *fopen(const char *path, const char *mode);
1.功能
按照mode规定的方式去打开path里指定文件。
2.参数
path是个字符指针,指向打开或建立文件的字符串
mode是指向文件处理的字符串的指针

3.返回值
正常:被打开文件的FILE指针
异常:NULL,未成功打开
- 文件的关闭
int fclose(FILE *fp);
1.功能
关闭由fp指出的文件,调用操作系统提供的文件关闭功能。
2.参数
fp:打开文件的FILE指针
3.返回值
正常:0
异常:EOF
- 文件读取
①字符读取
int fgetc(FILE *stream);
1.功能
从stream所指文件中读取一个字符
2.参数
stream:要读取字符文件的FILE指针
3.返回值
正常:返回读取字符
异常:返回EOF
②字符串读取
char *fgets(char *s, int size, FILE *stream);
1.功能
从stream中读取大小为size-1的字符,最后加上字符串结束符'\0'
2.参数
s:接收字符串的地址,数组或是指针
size:读取字符大小
stream:读取的文件的FILE指针
3.返回值
正常:字符串首地址(char *s的地址)
异常:NULL
使用feof或是ferror去判别是否到达文件尾部和发生错误。
- 文件的写入
①字符写入
int fputc(int c, FILE *stream);
1.功能
把字符c写入stream指向的文件
2.参数
c:字符
stream:写入的文件的FILE指针
3.返回值
正常:写入字符
异常:EOF
②字符串的写入
int fputs(const char *s, FILE *stream);
1.功能
将str写入stream指向的文件中
2.参数
s:写入字符串
stream:要写入字符串的文件的FILE指针
3.返回值
正常:写入的字符串长度
异常:返回NULL
使用feof或是ferror去判别是否到达文件尾部和发生错误。
③格式化数据写入
int fprintf(FILE *stream, const char *format, ...);
1.功能
与printf功能相同,写入文件中
2.参数
stream:写入的文件的FILE指针
format:字符串指针,其中包含写入数据的格式
3.返回值
无
- 二进制形式的读写
①二进制形式读取文件数据
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
1.功能
按二进制形式将stream指向的文件的size*nmemb的数据读到ptr数据区去
2.参数
ptr:viod指针类型,读到数据存放的首地址
size:数据块的大小,字节数
nmemb:一次读多少数据块
stream:要读取数据文件的FILE指针
3.返回值
正常:实际读取数据块个数
异常:0(具体通过feof()和ferror()判定)
②二进制形式写数据
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
与fread相反
③二进制形式读取一个整数
int getw(FILE *stream);
④二进制形式写入一个整数
int putw(int w, FILE *stream);
- 文件状态检查
①文件结束
int feof(FILE *stream);
1.功能
判断文件是否结束
2.返回值
0:文件未结束
1:文件结束
②文件读写出错
int ferror(FILE *stream);
1.功能
检查读写stream指向的文件是否出错
2.返回值
0:无错误
1:出错
③错误标志清除
void clearerr(FILE *stream);
1.功能
清楚stream指向的文件的错误标志
- 文件的操作的文件
①当前文件位置
long ftell(FILE *stream);
1.功能
文件开头与当前的偏移量
2.返回值
正常:位移量
异常:-1
②倒带
void rewind(FILE *stream);
1.功能
文件位置指针重新指向开头
③fseek
int fseek(FILE *stream, long offset, int whence);
1.功能
使文件定位移到指定位置:基于whence的相对offest位置处
2.参数
offset:字节位移量
whence:
SEEK_SET 0 文件开头
SEEK_CUR 1 文件当前位置
SEEK_END 2 文件末尾
3.返回值
正常:当前位置
异常:-1
- exit()函数
void exit(int status);
1.功能
使程序立即终止执行,将缓冲区数据输出并关闭所有打开文件
2.参数
0:正常终止
作者:Devil-wei
出处:https://www.cnblogs.com/Devil-wei/
版权声明:本文版权归作者,转载请标注文章作者与出处
c文件操作整理的更多相关文章
- Golang文件操作整理
基本操作 文件创建 创建文件的时候,一定要注意权限问题,一般默认的文件权限是 0666 关于权限的相关内容,具体可以参考鸟叔p141 这里还是再回顾下,文件属性 r w x r w x r w x,第 ...
- PHP文件操作整理
三种目录表示: ./ 代表当前目录 ../ 代表父级目录 / 代表根目录 常用的文件操作函数有 通用读写: fpen() fwrite() fre ...
- Python-字典、集合、字符编码、文件操作整理-Day3
1.字典 1.1.为什么有字典: 有个需求,存所有人的信息 这时候列表就不能轻易的表示完全names = ['stone','liang'] 1.2.元组: 定义符号()t = (1,2,3)tupl ...
- hadoop的文件操作整理java
package dada; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; im ...
- Linux下普通IO文件操作函数---C语言
普通文件IO总结 FILE结构体 typedef struct { int level; /*填充/清空一级缓存*/ unsigned flag; /*文件状态指针*/ ...
- php常见的类库-文件操作类
工作中经常用php操作文件,因此把常用文件操作整理出来: class hylaz_file{ /** * Read file * @param string $pathname * @return s ...
- Linux文件操作常用命令整理
收集.整理日常系统管理或维护当中的,常用到的一些关于文件操作的命令或需求,后续会慢慢补充.完善! 查看.生成指定目录的目录树结构? [root@DB-Server ~]#tree #当前目录 ...
- HTML5 本地文件操作之FileSystemAPI整理(二)
一.文件目录操作 1.DirectoryEntry对象 属性: 1.isFile: 操作对象的是否为文件,DirectoryEntry对象固定其值为false 2.isDirectory: 操作对象是 ...
- 【整理】C#文件操作大全(SamWang)
[整理]C#文件操作大全(SamWang) 文件与文件夹操作主要用到以下几个类: 1.File类: 提供用于创建.复制.删除.移动和打开文件的静态方法,并协助创建 FileStream 对象. msd ...
随机推荐
- PMP应考知识点-合同类型以及选择要领
合同类型的选择貌似是必考知识点,加上对合同类型的了解和选择的要领,对于开展日常工作来讲也是挺有必要的.所以这两天重新回顾并总结了合同的种类和各种类的选择要领,与大家分享. 转走请标明出处 https ...
- SQL Server获取连续区间的日期
个人理解的方法有三种 通过系统表master..spt_values获取 用WHILE循环获取 游标获取 CET递归(感谢评论区博友) 方法一:通过系统表master..spt_values获取 1. ...
- cnzz流量统计
var regexp=/\.(baidu)(\.[a-z0-9\-]+){1,2}\//ig; var where =document.referrer; if(where.indexOf(" ...
- java虚拟机内存区域
java虚拟机运行时数据 程序计数器 是一块较小的内存空间,属于线程私有的内存. 用来记录正在执行的虚拟机字节码指令的地址. 每个线程都需要一个独立的程序计数器,各个线程间的计数器互不影响,独立存储. ...
- 那些优秀的.NET开发者----汪宇杰:从重视细节,到成就技术专家
初识汪宇杰 在长沙.NET技术社区筹建过程中,溪源有幸认识来自上海的MVP汪宇杰Edi Wang.在中国众多的微软MVP中,Edi Wang作为一名九零后,也是一位年轻而充满才气的开发者,或许他或许外 ...
- Linux篇---ftp服务器的搭建
一.前述 企业中linux搭建ftp服务器还是很实用的,所以本文针对centoos7和centoos6搭建服务器教程做个总结. 二.具体 1.显示如下图则表示已安装 vsftp软件.如果未显示则需要安 ...
- 网络协议 16 - DNS 协议:网络世界的地址簿
[前五篇]系列文章传送门: 网络协议 11 - Socket 编程(下):眼见为实耳听为虚 网络协议 12 - HTTP 协议:常用而不简单 网络协议 13 - HTTPS 协议:加密路上无尽头 网络 ...
- 关闭 Mac 拼写自动纠正与横线转换
如果你是个程序员, 如果你恰好用 mac 自带的 notes 来做笔记, 很大可能性, 你会在里面贴代码, 但是, Mac 的拼写检查和自动纠正功能,会把代码变成你不想要的样子, 比如, 它会为你首字 ...
- apriori && fpgrowth:频繁模式与关联规则挖掘
已迁移到我新博客,阅读体验更佳apriori && fpgrowth:频繁模式与关联规则挖掘 详细代码我放在github上:click me 一.实验说明 1.1 任务描述 1.2 数 ...
- 分布式事务解决方案FESCAR
项目地址:FESCAR 以下是官网的文档.简介2019年,Fescar 是 阿里巴巴 开源的 分布式事务中间件,以 高效 并且对业务 0 侵入 的方式,解决 微服务 场景下面临的分布式事务问题. 1. ...