文章目录

  • 1 二进制文件和文本文件
  • 2 缓冲文件系统与文件指针
    • 2.1 缓冲文件系统
    • 2.2 文件指针
  • 3 文件的打开和关闭
  • 4 文件的顺序读/写
    • 4.1 文件访问步骤
    • 4.2 字符
    • 4.3 字符串
    • 4.4 格式化
    • 4.5 数据块
  • 5 文件的随机读/写

1 二进制文件和文本文件

文件:存放在磁盘上的一组相关信息的集合。

“磁盘文件名”:[盘符][路径]<主文件名>.[<扩展名>]
磁盘文件按数据存放的格式分类,可分成:

  • 文本文件
    内存中的数据转换成ASCII码存储在文件上,每个ASCII码代表一个字符。
  • 二进制文件
    内存中的数据按其内存中的存储形式不进行格式转换而直接存放在文件上。

2 缓冲文件系统与文件指针

2.1 缓冲文件系统

内存中用于数据存储的数据块,由系统自动分配。

2.2 文件指针

为了实现对文件的操作,把与文件操作相关的信息定义成了FILE结构体类型

typedef struct
{short  level;      /*缓冲区使用量*/unsigned flags;   /*文件状态标志*/char  fd;     /*文件描述符*/short  bsize;      /*缓冲区大小*/unsigned char *buffer;   /*文件缓冲区的首地址*/unsigned char *curp;    /*指向文件缓冲区的指针*/……
}FILE;
  • FILE在stdio.h文件中定义——#include<stdio.h>。

  • 处理文件都是通过文件指针进行的

  • 文件指针的定义形式如下:

    FILE *fp1,*fp2;
    fp1和fp2——FILE类型的文件指针

  • 再通过fopen( )函数使得它们能够分别指向各自的文件缓冲区,程序就能利用它们访问文件了。

3 文件的打开和关闭

  • 打开文件:

    • 建立文件的各种有关信息
    • 文件指针指向该文件,以便进行其它操作。

FILE *fopen(char *fname, char *mode)
如:fp = fopen(“D:\test.txt”, “a+”);

  • 关闭文件:

    • 断开指针与文件之间的联系,
    • 禁止再对该文件进行操作。
  • 文件操作都是由库函数完成的。

  • 打开文件模式

打开模式类型 意义
r 文本文件,只读文件必须已存在,否则函数返回出错信息(NULL)。
w 建立新文本文件进行只写,如果文件已存在,则文件的内容将被删除,成为一个空文件。
a 文本文件,追加(向文件末尾添加数据),原文件数据保留文件必须已存在,否则函数返回出错信息(NULL)
+ 与上面的字符串组合,表示以读写方式打开文本文件,既可向文件中写入数据,也可从文件中读出数据。
b 与上面的字符串组合,表示要打开的是一个二进制文件

  • 打开文件 fopen():

    • 成功——包含文件缓区等信息的FILE结构地址赋给文件指针fp。
    • 失败——返回一个NULL(空值),表明文件abc.txt无法正常打开(可能是abc.txt不存在、路径不对或是文件已经被别的程序打开等)
    • 为保证文件操作的可靠性,调用fopen( )函数时最好做一个判断,以确保文件正常打开后再进行读写。其形式为:
      if ((fp = fopen("D:\\test.bin", "rb")) == NULL) {printf("Can’t open this file. \n");exit(0);}

exit(0):系统标准函数,作用是关闭所有打开的文件并终止程序的执行。0表示程序正常结束,非0表示不正常的程序结束

  • 关闭文件fclose( ):

fclose(文件指针);

  • 强制把缓冲区中的数据写入磁盘
  • 释放文件缓冲区单元和FILE结构,使文件指针与具体文件脱钩。

4 文件的顺序读/写

4.1 文件访问步骤

  1. 定义文件指针;
  2. 打开文件:文件指针指向磁盘文件缓冲区;
  3. 文件处理:文件读写操作;
  4. 关闭文件。

步骤三:
标准库stdio.h中提供了一系列文件的读写操作函数:
字符: fgetc( )和fputc( );
字符串: fgets( )和fputs( );
格式化方式: fscanf( )和fprintf( );
数据块方式: fread( )和fwrite( );

4.2 字符

  1. 文件的字符读函数:int fgetc(FILE *fp);

    • 从fp所指的文件中读取下一个字符,并返回读取的字符值
    • 若读到文件末尾或出错时,则返回EOF(EOF是一个符号常量,在stdio.h中定义为-1)。
    • 通常使用feof()检查位置指针是否到达文件末尾,当到达末尾是返回非0值,未到达尾部返回0值。 while(!feof()) { }
  2. 文件的字符写函数:int fputc(int c, FILE *fp);
    • 将字符c写到文件指针fp所指的文件中,
    • 若写入错误,则返回EOF,否则返回字符c。

4.3 字符串

  1. 文件的字符串读函数
    char * fgets(char *s, int n, FILE *fp);

    • 从fp所指的文件中读取字符串,存入s为起始地址的存储单元内
    • 系统在读入结束后会在最后加一个‘\0’,最多读入n-1个字符
    • 函数返回该字符串的首地址
  2. 文件的字符串写函数
    int fputs(char *s,FILE *fp);

    • 字符串s的内容写入fp所指向的文件中。
    • 注意字符串中最后的‘\0’不写入,也不自动添加‘\n’。
    • 写入成功则函数返回为0,否则为-1(EOF)。

4.4 格式化

  1. 文件的格式化读函数
    int fscanf(FILE *fp, const char *format,...);

    • 后两个参数和返回值与函数scanf( )相同。
  2. 文件的格式化写函数
    int fprintf(FILE *fp, const char *format, ...);

    • 后两个参数和返回值与函数scanf( )相同

用函数fscanf( )和fprintf( )进行文件的格式化读写,读写方便,容易理解,但输入时要将ASCII字符转换成二进制数,输出时要将二进制数转换为ASCII字符,耗时较多。

4.5 数据块

  1. 文件的数据块方式读函数
    int fread(void *buffer,int size,int count ,FILE *fp)

    • fp所指的文件中读取count个数据块(每个数据块长度为size个字节),存入buffer所指的存储区中
    • 如果成功,则返回实际所读的数据块个数,否则返回0。
  2. 文件的数据块方式写函数
    int fwrite(void *buffer,int size,int count,FILE *fp)

    • 以buffer为起始地址count个数据块(每个数据块长度为size个字节)写入到fp所指的文件
    • 如果成功,则返回写入数据块的个数,否则返回0

5 文件的随机读/写

C语言 第十二章 文件相关推荐

  1. c语言压缩文本文件北京理工大学,北京理工大学C语言程序设计第十二章文件.ppt...

    北京理工大学C语言程序设计第十二章文件 2000年1月25日 北京理工大学 / 第十二章 文件 第一节 文件概述 第二节 文件的处理 第三节 文件的顺序读写操作 第四节 文件的随机读写操作 第五节 文 ...

  2. 第十二章 文件上传和下载

    目录 如何实现文件上传 文件上传的相关API 实现文件上传 实现文件下载 一.如何实现文件上传 要实现Web开发中的文件上传功能,通常需完成两步操作:一是在Web页面中添加上传输入项:二是在Servl ...

  3. 趣学 C 语言(十二)—— 文件操作

    对于 C 语言而言,无论是标准输入 stdin,还是标准输出 stdout,还是标准错误输出 stderr,本质上都是一种文件操作,只不过读写的文件变成了控制台(console),或者说 stdin/ ...

  4. go程序设计语言第十二章-反射

    the go programming language Go提供一种机制,能够在运行时更新变量.查看它们的值,调用它们的方法和它们内在的操作,所有的这些都不需要在编译时知道它们的类型.这种机制就叫做反 ...

  5. 【JAVA SE】第十二章 流(Stream)、IO流和文件(File)

    第十二章 流(Stream).IO和文件(File) 文章目录 第十二章 流(Stream).IO和文件(File) 一.流(Stream) 1.什么是流 2.流的分类 二.IO流 1.字节输入流(I ...

  6. 谭浩强c语言不讲位运算呢,谭浩强C语言教程第十二章-位运算.doc

    谭浩强C语言教程第十二章-位运算 12位运算1 12.1位运算符C语言提供了六种位运算符:1 12.1.1按位与运算1 12.1.2按位或运算2 12.1.3按位异或运算2 12.1.4求反运算3 1 ...

  7. R语言实战笔记--第十二章 重抽样(置换检验)与自助法

    R语言实战笔记–第十二章 重抽样(置换检验)与自助法 标签(空格分隔): R语言 重抽样 自助法 置换检验 置换检验 双样本均值检验的时候,假设检验的方法就是,检查正态性.独立性.方差齐性,分别对应的 ...

  8. 第十二章 Python文件操作【转】

    12.1 open() open()函数作用是打开文件,返回一个文件对象. 用法格式:open(name[, mode[, buffering[,encoding]]]) -> file obj ...

  9. 《深入理解 Spring Cloud 与微服务构建》第十二章 服务注册和发现 Consul

    <深入理解 Spring Cloud 与微服务构建>第十二章 服务注册和发现 Consul 文章目录 <深入理解 Spring Cloud 与微服务构建>第十二章 服务注册和发 ...

最新文章

  1. CentOS7定制封装发行版-基于CentOS minimal
  2. 二层以太网技术—Vecloud
  3. python 获取本机IP的三种方式
  4. 介绍了Oracle数据库锁的种类及研究
  5. [Erlang 0097] TCP半开的几个小测试
  6. tomcat+nginx+redis实现均衡负载、session共享
  7. splitpane如何设置竖条的宽度_如何用 CSS 画三角形和箭头
  8. 从环境搭建到回归神经网络案例,带你掌握Keras
  9. (46)System Verilog数组查找最大最小值
  10. Java使用RabbitMQ之订阅分发(Topic)
  11. [paper reading] SSD
  12. 基于SSH的电子政务系统(附论文)
  13. 线性代数(六)正交性
  14. ubuntu下安装jre 7
  15. 公众号迁移开通留言功能
  16. 2011考研数学核心题型-陈文灯
  17. 德勤中国持续深化与亚马逊云科技的合作,进一步扩充云技术人才储备
  18. 幻数 linux_查找第n个幻数
  19. h5新API=>IntersectionObserver
  20. 你深入解析过java虚拟机:C1编译器,从HIR到LIR吗?

热门文章

  1. (已解决)fatal: unable to access 'https://github.com/xxxxx': Failed to connect to http://127.0.0.1:1080
  2. 1521_AURIX TC275 FPI总线系统寄存器
  3. 寄存器英文全称中文翻译英文对照表
  4. 数据库分库分表解决方案
  5. python网络图片下载---跟我一起爬王者农药皮肤吧
  6. jmeter压测生成报告
  7. jmeter压测指标
  8. 网络工程师 100问
  9. 由ThinkServer RQ940死机到系统无法引导带来的感想
  10. 《众妙之门——Web用户体验设计与可用性测试》一2.2 从数字上看:行为应答...