内容纲要

文件

C语言中通过将数据写入外部文件进行保存,可以通过存储方式将文件区分为文本文件与二进制文件。文件使用时通过stdio.h头文件中内置的文件指针进行对文件的访问,可以通过函数对文件进行顺序读写与随机读写。

typedef struct{
    short level;  //缓冲区空或满的程度
    unsigned flags; //文件状态标志
    char fd;     //文件描述符
    unsigned char hold; //如无缓冲区则不读字符
    short bsize;   //缓冲区大小
    unsigned char *buffer; //数据缓冲区位置
    unsigned char *curp;  //当前活动的指针
    unsigned istemp; //临时文件指示器
    short token;     //用于有效性检查
} FILE;

定义指针变量

FILE *fp;

打开

通过fopen函数来打开文件

文件指针变量 = fopen(文件名,文件处理方式);
fp = fopen("test.txt","r");

文件名

文件名可以使用绝对路径c://test.txt和相对路径test.txt

处理方式

处理方式 文件存在时 文件不存在时
r 只读 以只读方式打开文本文件 返回NULL
w 只写 以只写方式打开或创建文本文件,并将源文件内容清空 创建新文件
a 追加 以追加方式打开文本文件,允许文件末尾写入数据 创建新文件
rb 只读 以只读方式二进制文件 返回NULL
wb 以只写方式打开或创建二进制文件,源文件内容清空 创建新文件
ab 追加 以追加方式打开二进制文件,允许在文件末尾写数据 创建新文件
r+ 读/写 以读/写方式打开文本文件 返回NULL
w+ 读/写 以读/写方式打开或创建文本文件,源文件内容清空 创建新文件
a+ 读/写 以读/写方式打开文本文件,允许读或在文件末尾追加数据 创建新文件
rb+ 读/写 以读/写方式打开二进制文件 返回NULL
wb+ 读/写 以读/写方式打开或创建二进制文件,源文件内容清空 创建新文件
ab+ 读/写 以读/写打开二进制文件,允许读或在文件末尾追加数据

关闭

将fp指向的文件流进行关闭,若文件关闭正常,返回值为0;若文件关闭错误,返回值为EOF(-1)。

int fclose(fp)

顺序读写

读文件

  1. 读字符函数fgetc()
字符变量 = fgetc(指针变量);
char c = fgetc(fp);

从文件中读取第一个字节字符,并且将指针移到下一个字节。

  1. 读字符串函数fgets()
fgets(字符数组名,读出字符串长度,指针变量);//读取字符串的长度中包括字符串结束标志'\0',实际读出字符为n-1
char str[1024];
fgets(str,10,fp);//实际读出9个字符

从文件中读出n-1个字符添加字符串结束符\0送入字符数组中。若读字符中遇到换行符或EOF则结束读,函数的返回值为字符数组的首地址。

  1. 格式化读函数fscanf()
fscanf(指针变量,"格式字符串",输出元素);
char a[10];
fscanf(fp,"%s",a);

通过格式化读出文件

写文件

  1. 写字符函数fputc()
fputc(字符,指针变量);
char c = 'a';
fputc(c,fp);

从文件中写入第一个字节字符,并且将指针移到下一个字节。若文本内已存在字符,则会从第一个字符开始覆盖。

  1. 读字符串函数fputs()
fputs(字符串,指针变量);
char str[] = "HelloWorld";
fputs(str,fp);

从文件中写入字符串,并且指针移到文件尾。

  1. 格式化写函数fprintf()
fprintf(指针变量,"格式字符串",输入元素);
char str[] = "HelloWorld";
fprintf(fp,"%s",str);

通过格式化写入文件

随机读写

将文件指针移到指定位置处进行读写

文件定位

  1. 将文件的指针位置移到文件首
rewind(文件指针);
rewind(fp);
  1. 将文件的指针位置移到指定位置
fseek(文件指针,位移量,起始点);
fseek(fp,20L,0);

表示将指针位置移到离文件首20个字节处,位移量表示移动的字节数,位移量的数据必须是long类型数据,常量表示时,必须加后缀L

起始点表示

起始点 表示符号 数字表示
文件首 SEEK_SET 0
当前位置 SEEK_CUR 1
文件末尾 SEEK_END 2

读写文件

将数据整块读写,常用于数组和结构体。

fread(buffer,size,count,fp);//读数据块
fwrite(buffer,size,count,fp);//写数据块
//buffer是一个表示输入的指针.size表示数据块字节数.count表示要读写数据块的个数,fp是文件指针
fread(a,4,5,fp);

将fp的文件每次读4个字节输入到a指针中连续读5次

#include <stdio.h>

struct {
    int age;
} student1,student2,*p,*q;

int main()
{
    FILE *fp;
    fp = fopen("test.txt","r+");
    student1.age=18;
    p=&student1;
    q=&student2;
    fwrite(p,sizeof(student1),1,fp);
    rewind(fp);
    fread(q,sizeof(student2),1,fp);
    printf("%d",q->age);
    return 0;
}

文件检测

  1. 文件结束检测

文件位于结束位置返回1,否则返回0。

feof(指针变量);
  1. 读写出错检测

文件读写时若未出错则返回0,否则表示出错。

ferror(指针变量);
  1. 出错结束标志置零

清除出错和结束标志,将值置为0。

clearerr(指针变量);

内存管理

C语言中可以通过stdlib.h头文件中定义的函数来进行内存管理,进行动态分配内存空间。

分配内存空间

分配固定大小的存储空间,并把首地址返回。

(数据类型 *)malloc(字节大小);
(数据类型 *)calloc(n块字节大小的连续空间,字节大小);

调整内存空间

在存储空间后追加或减少固定大小的存储空间

realloc

(数据类型 *)realloc(原空间地址, 重新分配的字节大小);

释放内存空间

释放指针变量所指向的内存空间

free(指针变量);
#include <stdio.h>
#include <stdlib.h>

typedef struct N{
    int data;
    struct N *next;
} Node;

int main()
{
    Node node,*p;
    node.data = 1;
    printf("p=%p\n",p);
    p = (Node *)malloc(sizeof(Node));
    printf("p=%p,sizeof(*p)=%d\n",p,sizeof(*p));
    p = (Node *)realloc(p,sizeof(Node)*3);;
    p->data=10;
    node.next = p;
    printf("%d",node.next->data);
    free(p);
    return 0;
}

运行结果:

p=0000000000000010
p=0000000000BB6DF0,sizeof(*p)=16
10
最后修改日期:2020年11月27日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。