C语言程序设计-Chap.8


文件

1. 概述

在一个C语言程序中,除了自行编写程序之外,我们还想到应该如何对计算机内依然存在的文件进行操作,这就引出了本文的主题。

内存与外存

要描述文件,首先需要从内存,外存两个概念说起。

内存的概念,此前曾多次提及,是各类变量,算法储存的位置,并会在程序运行结束后及时释放。
内存中的数据会在关机后立刻消失。

如果对DIY有一定了解,则会常常听到“内存条”,就是这东西。

外存则是永久存放各类文件,数据的地方,其中的数据在关机后不会消失。

同样的,接触到的固态硬盘,机械硬盘,以及延伸至各类u盘,软盘,都属于外存的范畴。

文件

文件 是数据的集合,也是操作系统储存数据的基本方法。

文件有以下基本属性:

  1. 文件名
  2. 占用空间
  3. 存储位置
  4. 文件类型
  5. 读写属性
  6. 创建,访问,修改时间
  7. ….

操作系统为了使各种各样的文件有序的存储,衍生出了 目录 这一概念(即文件夹)

要通过程序操作文件,就必须要求相应的高级语言具有相应的文件操纵能力。

我们要达到的目的就是通过C语言程序访问文件,即对文件进行相关的输入(input),输出(output)操作。
为了简化书写,对输入输出,下文中简称为(I/O)

C语言中的文件形式

C语言将文件看成一个二进制流或字符流:

  1. 二进制流(常用于二进制文件):
    相当于把文件看成很多0/1序列,这种方式更有利于计算机的信息读取,保存,写入,但不利于阅读。
  2. 字符流(常用于文本文件):
    将文件看成很多字符序列的组合,每行后有一个换行符。这种形式很适合I/O操作。

与此同时,C语言在其标准库中加入了相应函数,包括:

  • 打开文件
  • 关闭文件
  • 读写文件

2. 文件的打开与关闭

文件的打开

在C语言中打开文件常用 fopen 函数:

FILE *fp  //定义文件类型指针
fp=fopen("这里写你的文件名(别忘加后缀)", "这里写打开方式");
if(fp==NULL){
    //这里处理无法打开的情况
}

几个注意事项:

  1. 如果打开文件成功,则返回一个FILE类型的指针地址,并且此后的文件操作都通过这个指针进行。
    如果打开失败,则返回空指针。
    因此利用C语言打开文件后一定要检查是否打开成功。
  2. c语言有很多种文件打开方式:
    • “r”: 打开文本文件,只读
    • “w”: 新建文本文件(或者删除原本的内容),只写
    • “a”: 打开文本文件,追加
    • “r+”: 打开文本文件,可以读+写
    • “w+”: 新建文本文件(删除原来的内容),可以读+写
    • “a+”: 打开文本文件,可以读+追加
  3. 如果用二进制模式打开文件则在打开方式后加b,即:”rb”,”ab+”等。

文件的关闭

在C语言中关闭文件常用 fclose 函数:

fclose(fp);

几点注意事项:

  • 对于执行写入操作的文件,会将缓冲区内的内容写入文件中,然后关闭文件。
  • 对于只读文件,会丢弃缓冲区内的内容,然后关闭文件
  • 程序退出时,所有文件会自动关闭

三个标准文件指针

C语言中,有三个自动生成的标准文件指针:

  • stdin(标准输入流)
  • stdout(标准输出流)
  • stderr(标准错误流)

stdin一般与键盘相连接,stdout一般与显示器相连接。

3. 文件的操作

文件的读写涉及到多个函数,这其中还包括顺序读写与随机读写两种类型。

文件的顺序读写

字符读写函数:fgetc & fputc

首先对fgetc函数进行说明。

char c;
FILE *p
p=fopen("myfile.txt", "r");  //通过只读模式打开一个文件
c=fgetc(p);  //从文件指针的位置读取一个字符

几点说明:

  • fgetc函数只能对以”r”(只读), “r+”(只读写)的文件进行操作。
  • fgetc函数通过文件内部的位置指针进行读取。
  • 每次读取一个字符,则文件指针fp向后移动一个位置。若读取失败(如读取到最后一个字符时),则返回EOF。
    注:在应用时,可以利用这个特性进行循环读入:
    while((c=fgetc(p))!=EOF){
     printf("%c", c);
    }  //通过这种方式实现对文件的整体输出。

此后是fputc函数。

char c;
FILE *p;
fputc(ch, p); //在p所指向的位置写入一个字符

几点说明:

  • 被fput操作的文件只能是通过”w”, “w+”, “a”所打开的文件。
  • 每写入一个字符,则字符指针fp向后移动一个位置。若写入失败,返回EOF。

字符串读写函数:fgets & fputs

先对fgets进行说明

char str[n];  //这里权且为了说明写了n,正常情况下这种写法不合规
FILE *p;
......  //省略文件打开的过程
fgets(str, n, fp);  //在fp的位置读取n-1个字符,并将其放入str中

几点说明:

  • fgets函数如果遇到了换行符或EOF,则自动结束读取。
  • fgets函数的返回值为字符数组的首地址。
  • 若读取失败,则返回NULL。

在对fputs进行说明

char str[n];
FILE *p;
......
fputs(str, p);  //在p的位置将str送入文件

该函数执行成功则返回0,否则则返回EOF。

格式化读写函数:fscanf & fprintf

从名字就能看出来,这两个函数与scanf以及printf的功能及其类似,区别在于这两个函数的操作对象是文件,而scanf,printf的操作对象为键盘。(标准输入设备)

......  //省略文件打开过程
fscanf(fp, "%d", &a);  //将文件中的数据读取并存储在变量中
fprintf(fp, "%s", str);  //将变量中的数据写入到文件中

数据块读写函数 fread & fwrite

fread与fwrite常用于二进制文件。

fread(fa, 4, 5, fp);  //从fp的位置开始每次读4个字节,读5次,并存入fa所在的地址中。(fa,fp均为指针)
fwrite(fa, 4, 5, fp);  //从fa的位置每次取4个字节,取5次,并放入fp所指向的文件中。

文件定位函数:rewind & fseek

先对rewind进行说明

rewind(fp);  //将fp放置到文件开头

在对fseek进行说明

fseek(fp, 5, 0);

fseek函数比较复杂:

  • 第一个参数fp为文件指针。
  • 第二个参数为偏移量(一个long型变量)。
  • 第三个参数为偏移起始点:
    • SEEK_SET:代表文件开头(也可以用0代替)
    • SEEK_CUR:代表现在fp所在的位置(也可以用1代替)
    • SEEK_END:代表文件末尾(也可以用2代替)

文件的检测

错误检测:ferror

ferror(fp); //检测被操作文件的当前状态,正常则返回0,错误则返回1

清除出错:clearerr

clearerr(fp);  //将所有文件错误标志与文件结束标志强制置0

以上,是文件操作的所有函数。
确实很复杂,并且博主用的也确实很少 (现在谁还用C语言编辑文档啊.jpg)
随用随取吧。

这篇博文就到这里~~


文章作者: MUG-chen
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 MUG-chen !
  目录
加载中...