《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文件操作整理的更多相关文章

  1. Golang文件操作整理

    基本操作 文件创建 创建文件的时候,一定要注意权限问题,一般默认的文件权限是 0666 关于权限的相关内容,具体可以参考鸟叔p141 这里还是再回顾下,文件属性 r w x r w x r w x,第 ...

  2. PHP文件操作整理

    三种目录表示: ./     代表当前目录 ../    代表父级目录 /   代表根目录 常用的文件操作函数有 通用读写:                  fpen()  fwrite() fre ...

  3. Python-字典、集合、字符编码、文件操作整理-Day3

    1.字典 1.1.为什么有字典: 有个需求,存所有人的信息 这时候列表就不能轻易的表示完全names = ['stone','liang'] 1.2.元组: 定义符号()t = (1,2,3)tupl ...

  4. hadoop的文件操作整理java

    package dada; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; im ...

  5. Linux下普通IO文件操作函数---C语言

    普通文件IO总结 FILE结构体    typedef struct   {       int level; /*填充/清空一级缓存*/     unsigned flag; /*文件状态指针*/ ...

  6. php常见的类库-文件操作类

    工作中经常用php操作文件,因此把常用文件操作整理出来: class hylaz_file{ /** * Read file * @param string $pathname * @return s ...

  7. Linux文件操作常用命令整理

    收集.整理日常系统管理或维护当中的,常用到的一些关于文件操作的命令或需求,后续会慢慢补充.完善! 查看.生成指定目录的目录树结构?   [root@DB-Server ~]#tree   #当前目录 ...

  8. HTML5 本地文件操作之FileSystemAPI整理(二)

    一.文件目录操作 1.DirectoryEntry对象 属性: 1.isFile: 操作对象的是否为文件,DirectoryEntry对象固定其值为false 2.isDirectory: 操作对象是 ...

  9. 【整理】C#文件操作大全(SamWang)

    [整理]C#文件操作大全(SamWang) 文件与文件夹操作主要用到以下几个类: 1.File类: 提供用于创建.复制.删除.移动和打开文件的静态方法,并协助创建 FileStream 对象. msd ...

随机推荐

  1. 关于IT公司技术委员会职责

    技术委员会的核心职责 组织人才相关 • 制定职级标准 - 能力框架:知识,技能,通用素质 - 职级标准:T2T3T4-P7P8P9- • 职级评审,对齐标准 • 高端招聘,对齐标准 • 校园招聘,对齐 ...

  2. 【转载】 Sqlserver中查看自定义函数被哪些对象引用

    Sqlserver数据库中支持自定义函数,包含表值函数和标量值函数,表值函数一般返回多个数据行即数据集,而标量值函数一般返回一个值,在数据库的存储过程中可调用自定义函数,也可在该自定义函数中调用另一个 ...

  3. redis数据操作

    数据结构 redis是key-value的数据结构,每条数据都是一条字符串.注意:键的类型是字符串,并且不能重复. 值的类型分5种: 字符串string 哈希hash 列表list 集合set 有序集 ...

  4. JavaScript中的 NaN 与 isNaN

    NaN NaN 即 Not a Number ,不是一个数字. 在 JavaScript 中,整数和浮点数都统称为 Number 类型 .除此之外,Number 类型还有一个很特殊的值,即 NaN . ...

  5. python接口自动化(七)--状态码详解对照表(详解)

    简介 我们为啥要了解状态码,从它的作用,就不言而喻了.如果不了解,我们就会像个无头苍蝇,横冲直撞.遇到问题也不知道从何处入手,就是想找别人帮忙,也不知道是找前端还是后端的工程师. 状态码的作用是:we ...

  6. ASP.NET Core中使用GraphQL - 第一章 Hello World

    前言 你是否已经厌倦了REST风格的API? 让我们来聊一下GraphQL. GraphQL提供了一种声明式的方式从服务器拉取数据.你可以从GraphQL官网中了解到GraphQL的所有优点.在这一系 ...

  7. RabbitMQ消息队列(一)-RabbitMQ的优劣势及产生背景

    本篇并没有直接讲到技术,例如没有先写个Helloword.我想在选择了解或者学习一门技术之前先要明白为什么要现在这个技术而不是其他的,以免到最后发现自己学错了.同时如果已经确定就是他,最好先要了解下技 ...

  8. JVM平台上的响应式流(Reactive Streams)规范

    // Reactive Streams // 响应式流是一个倡议,用来为具有非阻塞后压的异步流处理提供一个标准.大家努力的目标集中在运行时环境(JVM和JavaScript)和网络协议上. 注:响应式 ...

  9. RequireJS入门级_RequireJS能给我们带来什么帮助?

    前言:其实很早前就已经接触和了解到RequireJS了,当时只是大概明白它能用来控制JS的加载顺序,即:页面一定要先加载这个JS,再加载那个JS,对于RequireJS的好处还没有一个真正的体会和认识 ...

  10. 关于Exceptionless的使用注意

    大家都应该比较熟悉NLOG,我们知道log4net和nlog,也有其它的记日志框架.目前我们的生产环境使用nlog,而且对Exceptionless的对接也是无缝的.可能有人会问为什么不用ELK,主要 ...