C语言文件

一切数据皆文件,大部分设备也是文件

一切数据处理程序运行都是在内存中完成

  1. 文件的概念

    • 文件用来存放程序、文档、音频、视频数据、图片等数据的
    • 文件就是存放在磁盘上的,一些数据的集合。
  2. 文件缓冲区是库函数申请的一段内存,由库函数对其进行操作,程序员没有必要知道存放在哪里,只需要对文件操作的时候的一些缓冲特点即可
    • 行缓冲

      • 标准io库函数,往标准输出(屏幕)输出东西的时候是行缓冲的
      • 所谓的行缓冲就是缓冲区碰到换行符的时候才刷新缓冲区
    • 全缓冲
      • 标准io库函数,往普通文件读写数据的,是全缓冲的
      • 碰到换行符也不刷新缓冲区,即缓冲区满了,才刷新缓冲区
      • 刷新缓冲区的情况
        • 缓冲区满了,刷新缓冲区
        • 人为刷新缓冲区 fflush(文件指针)
        • 程序正常结束 会刷新缓冲区
    • 无缓冲
      • 在读写文件的时候通过系统调用io (read write),对文件进行读写数据
      • 这个时候是无缓冲的,即写数据会立马进入文件 ,读数据会立马进入内存
    • 写文件的流程
      • 应用程序空间->内核空间->驱动程序 ->硬盘上
      • 应用程序和内核程序运行在不同的空间里,目的是为了保护内核
    • 设置缓冲区的目的
      • 通过缓冲可以减少进出内核的次数,以提高效率
  3. 磁盘文件的分类
    • 一个文件通常是磁盘上一段命名的存储区

      • 计算机的存储在物理上是二进制的,所以物理上所有的磁盘文件本质上都是一样的,以字节为单位进行顺序存储
      • 从用户或者操作系统使用的角度(逻辑上)
        • 把文件分为

          • 文本文件

            • 基于字符编码,常见的编码有 ASCII,UNICODE等
            • 一般可以使用文本编辑器直接打开
            • 歌词文件(lrc):二进制文件
          • 二进制文件
            • 基于值编码,自己根据具体应用,指定某个值是什么意思
            • 把内存中的数据按其在内存中的存储形式原样输出到磁盘上
            • 一般需要自己判断或使用特定软件分析数据格式
            • 音频文件(mp3):二进制文件
            • 图片文件(bmp)文件,一个像素点由两个字节来描述** * ** #####&&&&&
              • *代表红色的值
              • #代表绿色的值
              • &代表蓝色的值
              • 二进制文件以位来表示一个意思
          • 文本文件、二进制文件对比
            • 译码

              • 文本文件编码基于字符定长,译码容易些;
              • 二进制文件编码是变长的,译码难一些(不同的二进制文件格式,有不同的译码方式)
            • 空间利用率
              • 二进制文件用一个比特来代表一个意思(位操作)
              • 而文本文件任何一个意思至少一个字符
  4. 文件指针
    • 文件指针在程序中用来标示(代表)一个文件的,在打开文件的时候得到文件指针,文件指针就用来代表咱们打开的文件
    • 咱们对文件进行读、写、关闭等操作的时候,对文件指针进行操作即可,即咱们将文件指针,传给读、写、关闭等函数,那些函数就知道要对哪个文件进行操作
    • 定义文件指针的一般形式为
      • FILE *指针变量标识符

        • FILE 为大写 需要包含<stdio.h>
        • FILE 是系统使用typedef 定义出来的有关文件信息的一种结构体类型,结构中含有文件名、文件当前位置等信息
        • 一般情况下,我们操作文件前必须定义一个文件指针标示我们将要操作的文件
        • 实际编程中使用库函数操作文件,无需关心FILE结构体的细节,只需要将文件指针传给io库函数,再通过FILE结构体里的信息对文件进行操作
        • FILE 再stdio.h文件中的文件类型声明
          • typedef struct
          • {
          • short level; //缓冲区"满"或“空”的程度
          • unsigned flags;// 文件状态标志
          • char fd; //文件描述符
          • unsigned charhold; //如无缓冲区不读取字符
          • short bsize; //缓冲区的大小
          • unsigned char*buffer;//数据缓冲区的位置
          • unsigned ar*curp;//指针,当前的置信
          • unsigned istemp; //临时文件,指示器
          • shorttoken; //用于有效性检查
          • }FILE
          • 再缓冲文件系统中,每个被使用的文件都要再内存中开辟一块FILE类型的区域 ,存放与操作文件相关的信息。
      • 对文件操作的步骤:
        • 对文件进行读写等操作之前要打开文件得到文件指针
        • 可以通过文件指针对文件进行读写等操作
        • 读写等操作完毕后,要关闭文件,关闭文件后,就不能再通过此文件指针操作文件了
      • 补充
        • c语言中有三个特殊的文件指针无需定义,再程序中可以直接使用

          • stdin:标准输入 默认为当前终端(键盘)
          • stdout:标准输出 ,默认为当前终端(屏幕)
            • 我们使用的 printf、puts 函数默认输出信息到此终端
          • stderr: 标准错误输出设备文件 默认为当前终端(屏幕)
            • 当我们程序出错使用:perror 函数时信息打印再此终端
  5. 打开文件 fopen
    • 函数的定义:

      • FILE*fopen(const char *path,const char *mode);
    • 函数说明
      • fopen函数的功能是打开一个已经存在的文件,并返回这个文件的文件指针(文件的标示)或者创建一个文件,并打开此文件,然后返回文件的标示
    • 函数的参数
      • 参数1 :打开的文件的路径

          1. 绝对路径,从根目录开始的路径名称

            • “/home/edu/test/test.txt”
          2. 相对路径
            • "./test/test.txt"
            • "../test/test.txt"
      • 参数2:文件打开的方式,即以什么样的方式(只读、只写、可读可写等等)打开文件
  6. 关闭文件 fclose
    • 函数的头文件:

      • #include <stdio.h>
    • 函数的定义:
      • int fclose(FILE*fp);
    • 函数的说明:
      • 关闭fp所代表的文件
    • 注意一个文件只能关闭一次,不能多次关闭,关闭文件之后就不能再文件指针对文件进行读写等操作了
    • 返回值:
      • 成功返回0
      • 失败返回非0
    • 可以通过返回值,来判断关闭文件是否成功
  7. 一次读写一个字符
    • 函数定义

      • int fgetc(FILE * stream)
    • 函数说明:
      • fgetc从stream所标示的文件中读取一个字节,将字节值返回
    • 返回值:
      • 以t的方式:读到文件结尾返回EOF
      • 以b的方式: 读到文件结尾,使用feof判断结尾
      • feof(检查文件流是否读到了文件尾)
        • int feof (FILE * stream)
        • 函数说明: feof() 用来侦测是否读取到了文件尾,尾数stream 为fopen()返回之文件指针。如果已到文件尾则返回非零值,其他情况返回0
        • 返回值 返回非零值代表已到达文件尾
    • 函数定义:
      • int fputc(int c,FILE * stream)
    • 函数的说明
      • fputc将c的值写到stream所代表的文件中
    • 返回值
      • 如果输出成功,则返回输出的字节值
      • 如果输出失败,则返回一个EOF
  8. 一个读写一个字符串
    • char *fgets(char *s,int size ,FILE *stream);

      • 从stream所指的文件中读取字符,在读取的时候碰到换行符或者是碰到文件的末尾停止读取,或者是读取了size-1个字节停止读取,在读取的内容后面会价一个\0,作为字符串的结尾
      • 返回值:成功返回目的数组的首地址,即s
        • 失败返回NULL
    • int fputs(const char *s,FILE * stream);
      • 函数功能:

        • 将s指向的字符串,写到stream所代表的文件中
      • 返回值
        • 成功返回写入的字节数
        • 失败返回-1
  9. 读文件 fread
    • 函数的定义:

      • size_t fread (void * ptr, size_t size , size_t nmemb,FILE * stream);
    • 函数的说明:
      • fread函数从stream 所标示的文件中读取数据,一块是size个字节,共nmemb块,存放到ptr指向的内存
    • 返回值:
      • 实际读到的块数
    • 举例
      • int num;
      • num = fread(str,100,3,fp);
      • 从fp所代表的文件中读取内容存放到str指向的内存中,读取的字节数为,每块100个字节,共3块,返回值num
      • 如果读到300个字节返回值num为3
      • 如果读到了大于等于200个字节小于300个字节,返回值为2
      • 读到的字节数,大于等于100个字节小于200个字节,返回1
      • 不到100个字节返回0
  10. 写文件fwrite
    • 函数的定义:

      • size_t fwrite(void * ptr, size_t size, size_t nmemb ,FILE * stream);
    • 函数的说明:
      • fwrite 函数将ptr指向的内存里的数据,向stream所标示的文件写入
    • 返回值:
      • 调用成功,返回值为输入输出的基本单元数,如果执行失败,返回值为0
    • 注意:
      • fwrite 函数是将内存中的数据原样输出到文件中
      • fread 函数是将文件中的数据原样读取到内存中
  11. 格式化读写文件函数
    • 函数调用

      • fprintf(文件指针,格式字符串,输出表列);
      • fscanf(文件指针,格式字符串,输入表列);
    • 函数功能:
      • 从磁盘文件中读入或输出字符
    • fprintf和printf函数类似:
      • printf 是将数据输出到屏幕上(标准输出),而fprintf函数是将数据输出到文件中
    • fscanf和scanf函数类似
      • scanf是从键盘(标准输入)获取输入,而fscanf是从文件指针所标示的文件获取输入
  12. 随机读写
    • 可以移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称为随机读写。实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。
    • 完成文件定位的函数有
      • rewind函数 复位读写位置

        • void rewind(文件指针);
        • 函数功能:
          • 把文件内部的位置指针移到文件首
        • 调用形式:
          • text文件指针);
      • ftell 测文件读写位置距文件开始有多少个文件
        • 定义函数:

          • long ftell(文件指针);
        • 函数功能
          • 取得文件流目前得读写位置
        • 返回值:
          • 返回当前读写位置(距离文件起始得字节数)
      • fseek函数 定位位置指针(读写位置)
        • fseek函数(一般用于二进制文件即打开文件得方式需要带b)
        • 定义函数
          • int fseek(FILE * stream,long offset,int whence);
          • // int fseek(文件类型指针,位移量,起始点)
        • 函数功能:
          • 移动文件的读写位置
        • 参数:
          • whence 起始位置

            • 文件开头 SEEK_SET 0
            • 文件当前位置 SEEK_CUR 1
            • 文件末尾 SEEK_END 2
          • 位移量
            • 以起始点为基点,向前、后移动得字节数。可以为负。正数往文件末尾方向偏移,负数往文件首尾偏移
        • 返回值
          • 当调用成功时则返回0,若有错误则返回-1,errno会存放错误代码
  13. 文件加密/解密
    • 对称加密体制是传统而经典的加密体制策略。所谓对称加密体制即加密方A和解密方B共享一个密匙key。加密方A使用该密钥key对要保密的文件进行加密操作,从而生成密文;解密方B同样使用该密匙key对加密方生成的加密文件实施解密操作,从而生成明文

原文地址:https://www.cnblogs.com/fengzi759/p/11618722.html

时间: 2024-11-06 21:34:38

C语言文件的相关文章

C语言文件读写操作总结

C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取操作了.当使用打开函数时,必须给出文件名.文件操作方式(读.写或读写),如果该文件名不存在,就意味着建立(只对写文件而言,对读文件则出错),并将文件指针指向文件开头.若已有一个同名文件存在,则删除该文件,若无同名文件,则建立该文件,并将文件指针指向文件开头. fopen(char

C语言文件操作函数的编写

 编写文件操作的头文件 /************************************************************************** Copyright(C)    :2014-08-5 toto Filename       :file.h Author          :涂作权 Version         :V1.1 Date            :2014-08-05 Description     :文件操作的头文件 Others  

C语言 文件

小白一个,看到有错误,希望指出,万分感谢 /****************************************************************C语言文件概述:    一般文件可分为二进制文件和文本文件. 约定:我们把数据在终端上的表现形式称为数据的终端形式,而不 称为字符形式. 注:终端是指键盘 显示器等和用户直接打交道的输入输出设备. 二进制文件是把内存中的书按其在内存中的储存形式原样输出到磁 盘上存放,也就是说存放的是数据的原样式. 文本文件是把数据终端形式的二

C 语言文件操作

1. 数据流:     程序与数据的交互以流的形式进行.fopen 即打开数据流,fclose 即刷新数据流.     所谓数据流,是一种抽象,表示这段数据像流一样,需要逐步接收,不能随机存取:也意味着是一段连续的内容,每块数据之间的顺序是确定的.比如一个很大的文件,不能一次性加载到内存里面,无法直接获取文件任意位置的内容,只能逐渐加载到内存.     比如 TCP 被抽象为 stream 而 UDP 被抽象为 block.     2. 缓冲区:     fopen 时, 磁盘 --> 缓冲区

C语言文件的概念和文件指针

1 C语言文件的概念 在程序中,当调用输入函数从外部文件中输入数据赋给程序中的变量时,这种操作成为“输入”或“读”:当调用输出函数把程序中变量的值输出到外部文件中时,这种操作称为“输出”或“写”. C 语言中,对于输入.输出的数据都按“数据流”的形式进行处理.也就是说,输出时,系统不添加任何信息:输入时,逐一读入数据,直到遇到 EOF 或文件结束标志就停止.C 程序中的输入.输出文件都以数据流的形式存储在介质上. 对文件的输入.输出方式也称为“存取方式”.C 语言中,有两种对文件的存取方式:顺序

c语言文件操作函数

c语言文件操作函数大全 fopen(打开文件) 相关函数 open,fclose 表头文件 #include<stdio.h> 定义函数 FILE * fopen(const char * path,const char * mode); 函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态. mode有下列几种形态字符串: r 打开只读文件,该文件必须存在. r+ 打开可读写的文件,该文件必须存在. w 打开只写文件,若文件存在则文件长度清为0,即该文件

C语言文件的编译到执行的四个阶段

C语言文件的编译与执行的四个阶段并分别描述 C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接.编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程.链接是把目标文件.操作系统的启动代码和用到的库文件进行组织形成最终生成可执行代码的过程. 第一个阶段: 是预处理阶段,在正式的编译阶段之前进行.预处理阶段将根据已放置在文件中的预处理指令来修改源文件的内容.如#include指令就是一个预处理指令,它把头文件的内容添加到.cpp

go语言文件操作,这期资料比较详细( 欢迎加入go语言群: 218160862 )

go语言文件操作,这期资料比较详细 欢迎加入go语言群: go语言深圳群 golang深圳 218160862 文件操作 func Open(name string) (file *File, err error),*File 是实现了 io.Reader这个接口byte[] 转化为 bytes.Buffer:bytes.NewBuffer([]byte). 一.建立与打开 建立文件函数:func Create(name string) (file *File, err Error)func N

编译与反编译GNU Linux语言文件方法

/*********************************************************************  * Author  : Samson  * Date    : 11/21/2014  * Test platform:  *              3.13.0-24-generic  *              GNU bash, 4.3.11(1)-release  * ************************************

学习C/C++语言:文件的操作

#include<stdio.h> #include<stdlib.h> void main(int argc,char *argv[]) { FILE *in,*out; if(argc!=3) { printf("you forgot to enter a file name\n"); exit(0); } if((in=fopen(argv[1],"r"))==NULL) { printf("cannot open infli