文章目录

  • 为什么使用文件
  • 什么是文件
  • 文件名
  • 文件的打开和关闭
    • 文件指针
  • 文件的顺序读写
    • fgetc
    • fputc
    • fgets
    • fprintf
    • fscanf
    • fwrite
    • fread
  • 对比一组函数
    • sprintf
    • sscanf
  • 文件的随机读写
    • fseek
    • ftell
    • rewind
  • 文本文件和二进制文件
  • 文件读取结束的判定
  • 文件缓冲区

为什么使用文件

把数据存放在磁盘文件、存放到数据库,可以让数据持久化
使用文件我们可以将数据直接存放在电脑的硬盘上,也可以做到数据的持久化

什么是文件

磁盘上的文件是文件。
但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)

  • 程序文件

包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境
后缀为.exe)

  • 数据文件

文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,
或者输出内容的文件

文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。
文件名包含3部分:文件路径+文件名主干+文件后缀

例如: c:\code\test.txt

文件的打开和关闭

文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。

每个被使用的文件都在内存中开辟了一个相应的文件信息区

用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。

这些信息是保存在一个结构体变量中的。

该结构体类型是有系统声明的,取名FILE.



文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。

int main()
{FILE * pf = fopen("test.dat", "w");if (pf == NULL){perror("fopen");return  1;}//关闭文件fclose(pf);pf = NULL;return  0;
}

文件使用方式
“r”(只读) 为了输入数据,打开一个已经存在的文本文件 出错
“w”(只写) 为了输出数据,打开一个文本文件 建立一个新的文件
“a”(追加) 向文本文件尾添加数据 建立一个新的文件
“rb”(只读) 为了输入数据,打开一个二进制文件 出错
“wb”(只写) 为了输出数据,打开一个二进制文件 建立一个新的文件
“ab”(追加) 向一个二进制文件尾添加数据 出错
“r+”(读写) 为了读和写,打开一个文本文件 出错
“w+”(读写) 为了读和写,建议一个新的文件 建立一个新的文件
“a+”(读写) 打开一个文件,在文件尾进行读写 建立一个新的文件
“rb+”(读写) 为了读和写打开一个二进制文件 出错
“wb+”(读写) 为了读和写,新建一个新的二进制文件 建立一个新的文件
“ab+”(读写) 打开一个二进制文件,在文件尾进行读和写 建立一个新的文件

文件的顺序读写

补充1:

补充2:

C语言程序,只要运行起来,就默认打开了3个流:
stdin——标准输入流——键盘
stdout——标准输出流——屏幕
stderr——标准错误流——屏幕
他们的类型都是FILE*文件指针

fgetc

fgetc函数 适用于所有输入流

int main()
{FILE * pf = fopen("test.dat", "w");if (pf == NULL){perror("fopen");return  1;}int ret =fgetc(pf);printf("%c\n", ret);ret = fgetc(pf);printf("%c\n", ret);ret = fgetc(pf);printf("%c\n", ret);//关闭文件fclose(pf);pf = NULL;return  0;
}

fputc

int main()
{FILE * pf = fopen("test.dat", "w");if (pf == NULL){perror("fopen");return  1;}fputc('b', pf);fputc('i', pf);fputc('t', pf);//关闭文件fclose(pf);pf = NULL;return  0;
}

fgets

int main()
{char arr[10] = { 0 };FILE* pf = fopen("test.dat", "w");if (pf == NULL){ perror("fopen");return 1;}//读文件fgets(arr, 4, pf);printf("%s", arr);fgets(arr, 4, pf);printf("%s", arr);//关闭文件fclose(pf);pf = NULL;return 0;
}

fprintf

struct S
{char arr[10];int num;float sc;
};
int main()
{struct S s = { "abcdef", 10 , 5.5f};FILE* pf = fopen("test.dat", "w");if (NULL == pf){perror(fopen);return 1;    }//写文件fprintf(pf, "%s %d %f", s.arr ,s.num, s.sc  );//关闭文件fclose(pf);pf = NULL;return 0;
}

fscanf

struct S
{char arr[10];int num;float sc;
};
int main()
{struct S s = { 0 };FILE* pf = fopen("test.dat", "r");if (NULL == pf){perror(fopen);return 1;   }//读文件fscanf(pf, "%s %d %f", s.arr ,&(s.num), &(s.sc) );printf("%s %d %f\n", s.arr, s.num, s.sc);//关闭文件fclose(pf);pf = NULL;return 0;
}

fwrite

struct S
{char arr[10];int num;float sc;
};
int main()
{struct S s = { 0 };FILE* pf = fopen("test.dat", "r");if (NULL == pf){perror(fopen);return 1;   }//以二进制形式读文件fwrite(&s, sizeof(struct S), 1, pf);//关闭文件fclose(pf);pf = NULL;return 0;
}

fread

struct S
{char arr[10];int num;float sc;
};
int main()
{struct S s = { 0 };FILE* pf = fopen("test.dat", "r");if (NULL == pf){perror(fopen);return 1;   }//以二进制形式读文件fread(&s, sizeof(struct S), 1, pf);printf("%s %d %f\n", s.arr, s.num, s.sc);//关闭文件fclose(pf);pf = NULL;return 0;
}

对比一组函数

scanf 针对标准输入的格式化的输入语句——stdin
fscanf 针对所有输入流的格式化的输入语句——stdin/文件
sscanf 从一个字符串中读取一个格式化的数据

printf 针对标准输出的格式化的输出语句——stdout
fprintf 针对所有输出流的格式化的输出语句——stdout/文件
sprintf 把一个格式化的数据,转化为字符串

sprintf

struct S
{char arr[10];int age;float f;
};
int main()
{struct S s = { "hello", 10 , 5.5 };char buf[100] = { 0 };sprintf( buf , "%s %d %f", s.arr, s.age, s.f); //把一个格式化的数据,转化为字符串printf("%s\n", buf);return 0;
}

sscanf

struct S
{char arr[10];int age;float f;
};
int main()
{struct S s = { "hello", 10 , 5.5 };struct S tmp = { 0 };char buf[100] = { 0 };//从buf字符串还原出一个结构体数据sscanf(buf, "%s %d %f", s.arr, &(s.age), &(s.f)); //从一个字符串中读取一个格式化的数据printf("%s %d %f", s.arr, s.age, s.f);return 0;
}

文件的随机读写

fseek

根据文件指针的位置和偏移量来定位文件指针

int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1; }int ret = fgetc(pf);printf("%c\n", ret);//调整文件指针fseek(pf, -1, SEEK_CUR);ret = fgetc(pf);printf("%c\n", ret);ret = fgetc(pf);printf("%c\n", ret);fclose(pf);pf = NULL;return 0;
}

ftell

返回文件指针相对于起始位置的偏移量

int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1; }//调整文件指针fseek(pf, -1, SEEK_END);int ret = ftell(pf);printf("%d",ret);fclose(pf);pf = NULL;return 0;
}

rewind

让文件指针的位置回到文件的起始位置

int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1; }rewind(pf);int  ch = fgetc(pf);printf("%c",ch);fclose(pf);pf = NULL;return 0;
}

文本文件和二进制文件

根据数据的组织形式,数据文件被称为文本文件或者二进制文件。

数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。

一个数据在文件中是怎么存储的呢?
字符一律以ASCII形式存储,
数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。

文件读取结束的判定

在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束
而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。

  • 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )

例如:
fgetc 判断是否为 EOF . fetc正常读取的时候,返回的是读取到的字符的ASCII码值
fgets 判断返回值是否为 NULL ,fgets正常读取的时候 ,返回存放字符串空间的起始地址

  • 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。

例如:
fread函数在读取的时候,返回的是实际读取到的完整元素的个数
如果发现读取到的完整的元素小于 指定元素的个数 ,着就是最后一次读取了

文件缓冲区

从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。
如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓
冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)


如果你觉得这篇文章对你有帮助,不妨动动手指给点赞收藏加转发,给鄃鳕一个大大的关注
你们的每一次支持都将转化为我前进的动力!!!

这篇文章会让你熟悉文件的各种操作,让你对文件的认识更加深入【c语言】相关推荐

  1. 〖Python自动化办公篇⑥〗- word文件自动化 - word操作与读取word文件

    说明:该文属于 Python全栈白宝书专栏,免费阶段订阅数量4300+,购买任意白宝书体系化专栏可加入TFS-CLUB 私域社区. 福利:除了通过订阅"白宝书系列专栏"加入社区获取 ...

  2. 电脑文件恢复怎么操作?永久删除文件的恢复教程

    电脑的存储空间是有限的,当存储的数据越来越多,我们需要定时清理一些不需要的文件数据.如果重要文件被删除,电脑的撤销键.回收站都无法恢复文件,电脑文件恢复应该怎么操作?有什么好用的方法吗? 推荐使用下面 ...

  3. win7系统 在删除文件时提示“操作无法完成,因为文件已在windows资源管理器中打开”

    https://zhidao.baidu.com/question/616889197371830532.html 1.按ctrl+alt+delete打开任务管理器,依次进程–找到explorer. ...

  4. (理论篇)从基础文件IO说起虚拟内存,内存文件映射,零拷贝

    为了快速构建项目,使用高性能框架是我的职责,但若不去深究底层的细节会让我失去对技术的热爱. 探究的过程是痛苦并激动的,痛苦在于完全理解甚至要十天半月甚至没有机会去应用,激动在于技术的相同性,新的框架不 ...

  5. Python文件及目录操作(基本文件操作篇)

    ​ 活动地址:CSDN21天学习挑战赛 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩:迟一天就多一天平庸的困扰. 学习日记 目录 学习日记 一.前言 二.基本文件操作 1.创建和打开文件 2. ...

  6. C++基础部分_C++文件操作_文件的读取操作---C++语言工作笔记077

    上一篇文章,我们实现了文件的写入操作,现在,我们来看文件的,读取操作. 可以看到这个文件是,前面我们写入的文件 我们开始写代码,读取文件内容.按照上面的流程来读取文件 首先我们引入fstream这个, ...

  7. C语言——文件操作(2)文件的读写操作

    之前,我讲解了文件的基本情况与读写模式,看到这篇博客的小伙伴们先参考这篇博客: C语言--文件操作详解(1)_ 接下来,我会继续讲解文件操作的第二大步:文件读/写操作. 目录 A.文件的顺序读写 一. ...

  8. 文件类的操作 File c# 1614823687

    文件类的操作 File c# 1614823687 文件是否存在 文件的复制 复制前 代码 运行后的目录,复制成功了 小结 复制是边复制边重命名 注意 源文件必需得有 目标文件必需不存在 文件的移动操 ...

  9. Python文件(一):文件类型、文件的打开,读取写入,关闭、文件备份、文件和文件夹的操作

    一.文件 文件是存储在存储器上的一组数据序列,可以包含任何数据内容. 文件是数据的抽象和集合. 二.文件类型 文本文件:长字符串 二进制是信息按照非字符但有特定格式形成的文件,文件内部数据的组织格式与 ...

最新文章

  1. CIKM 2021 | 基于IPCA的多属性分子优化
  2. EAP-MD5认证暴力破解工具eapmd5pass
  3. CentOS下C++开发环境搭建
  4. 【好文收藏】K8S集群部署CoreDNS服务
  5. java小基础之instanceof运算符
  6. C++安全方向(三):3.2 单项散列函数的应用场景
  7. 运算放大器的偏置电流、失调电流
  8. 线段树 2017.4.20
  9. lvds接口_LVDS,接口,时序讲解,非常好的文章
  10. 第十四篇 项目整体管理__项目选择方法 之 投资收益率分析、投资回收期分析
  11. IM云通信行业步入快车道,融云或将和Twilio一样实现资本上市
  12. 易语言调用c 文本乱码,解决易语言编程乱码的问题
  13. 双系统linux grub rescue,WindowsUbuntu双系统一键Ghost,提示grub rescue的解决方法
  14. Vue的v-model的几种修饰符.lazy的介绍
  15. godaddy安装nginx证书
  16. 驱动专题:第四章MTD及Flash驱动 3. nandflash 详细硬件特性
  17. vue系列教程之微商城项目|项目创建
  18. Word Embedding 简述
  19. Spring Boot 2.x系列【9】功能篇之SpringApplication启动参数使用详解
  20. 2022年大厂招聘Java程序员的技术标准,你有什么看法?

热门文章

  1. 一个计算机系统的虚拟存储器的最大容量是由______确定的。 一个计算机系统的虚拟存储器,其最大容量和实际容量分别由什么决定
  2. 前端应该了解的直播知识
  3. u大师u盘装系统win7_U盘装系统教程
  4. Docker 基本操作 数据卷 -- docker 数据卷基本操作、挂载数据卷
  5. 7.4 布朗运动-马氏性和强马氏性
  6. 14. Linux系统服务管理
  7. 联通定制无线猫管理员账户密码(大连测试好用)
  8. Error filterStart startup failed due to previous errors
  9. linux sz命令详解?
  10. 李弘毅 机器学习课贴士