C语言的文件操作

一丶了解文件

       我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的保存,我们可以使⽤文件。

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

       程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程(windows 环境后缀为.exe)
       ⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或 者输出内容的⽂件。
       ⽂件名包含3部分:⽂件路径+⽂件名主⼲+⽂件后缀。
       根据数据的组织形式,数据⽂件被称为⽂本⽂件或者⼆进制⽂件。

二丶流

       我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。
       C语⾔程序在启动的时候,默认打开了3个流:
        stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊。
        stdout - 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯。
        stderr - 标准错误流,⼤多数环境中输出到显⽰器界⾯。
       这是默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进⾏输⼊输出操作的。

三丶关于文件的函数

1.fopen 和 fclose

      文件类型指针,简称文件指针,取名为“ FILE ”,定义一个FILE类型的指针 *pf 指向文件的文件信息区(结构体变量,这个结构体内部细节不必多了解)

FILE *pf

        文件的打开和关闭,打开方式是(我们先创建一个FILE类型的指针变量),FILE *pf = fopen("文件路径","打开方式(图二)"),关闭文件的方式是 fclose(文件指针),关闭之后记得将指针指向NULL。

#include<stdio.h>
int main()
{
    FILE *pf = fopen("data.txt","w+");
    fclose(pf);
    pf = NULL;
}

2.顺序读和写

      我们主要了解前六个函数,读:从文件中读取字符或者文本;写:从外部写入文件。

fgetc函数读取一个字符,函数会返回这个字符(int形式)。

      先看到我这个test文件有一个data.txt文件,里面事先写了一句“ Hello ”

       这里可以看到确实从文件中读取了一个字符“ H ”,此时文件内部指针指向的就是“ H ”,再次使用函数时,指针就指向了“ e ”,这里我想说的是,文件内部指针只有一个,读和写共用一个指针。

      fputc()函数就不说了,形式为 fputc("字符","文件指针"),接下来看看  fputs("字符串","文件指针"),紧跟刚刚的fgetc,我们仍然读到了“ H ”,然后我用了rewind()函数(将文件内部指针重新指向初始处),然后再 fputs 函数输入字符串到文件中去,覆盖了之前的内容。

      而fgets(接收字符串数组,最大字符串长度,文件指针)函数就是读字符串放在某个地方。

3.随机读和写

       之前提到的读写都是顺序读写,接下来接受几个随机读写函数。

       fseek(文件指针,偏移量,起始位置),这个函数是根据⽂件指针的位置和偏移量来定位⽂件指针。这里的起始位置不是特指文件起始位置,是根据下图确定起始位置的。SET是文件开头,CUR是文件内部指针当前位置,END则是文件末尾。

       事实证明,我们将文件内部指针从Y偏移了四个位置指向了S

      ftell(文件指针)返回文件指针相对于起始位置的偏移量,由于刚才读取了一次文件的字符串,没有用rewind()将指针调回去,所以相对于起始位置偏移了十个位置,打印出来的就是10了

       rewind(文件指针),这个函数刚刚我们一直在用,也不用单独介绍了。

四丶文件读取结束判定

       牢记:在⽂件读取过程中,不能⽤ feof 函数的返回值直接来判断⽂件的是否结束。
feof 的作⽤是:当⽂件读取结束的时候,判断是读取结束的原因是否是:遇到⽂件尾结束。
1. ⽂本⽂件读取是否结束,判断返回值是否为 EOF fgetc ),或者 NULL fgets
例如:
fgetc 判断是否为 EOF .
fgets 判断返回值是否为 NULL .
2. ⼆进制⽂件的读取结束判断,判断返回值是否⼩于实际要读的个数。
       int ferror(FILE * stream),检查是否设置了与流关联的错误指示器,如果设置了就返回与0不同的值,比如下面这个,打开方式只读,可我要写,不久难忘文件指针了吗?就会报错。
       下面这个很明显feof函数返回值非0,说明成功读取结束。

五丶了解一下

       ANSIC 标准采⽤“缓冲⽂件系统”处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输 ⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的⼤⼩根据C编译系统决定的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值