[c] _ c语言的数据文件操作

2019-12-25  本文已影响0人  葛木小舍先生丶

文件是程序设计的一个重要的概念,在C语言中,常常将处理数据的程序,和要处理的数据分离开来.提高程序的方便性和实用性.


文件具有多样性,存在磁盘的叫磁盘文件,计算机相连的设备是设备文件,存放数据的是数据文件.而已二进制存储的是二进制文件,存放程序的是源文件.

数据文件指一组相关的有序集合.存储在外部介质上,并用文件名作为其文件标志.在程序执行期间,必须先调入内存.每次读写都需要读取磁盘数据文件就非常费时,于是为了加速文件存取速率.系统使用缓冲区进行数据的暂存.从文件中读写变成从缓冲区中读写.

ASCll码文件也就是文本文件,在计算机中以字节存储,每个字符对应一个字节.二进制文件,采用二进制编码.
但在c系统中处理文件时,并不区分其类型.都看做字符流.按字节处理.

文件的读写操作都是先对缓存区进行操作的,只有在关闭文件后才会写入磁盘


在缓冲文件系统中,针对每个被使用的文件在内存中开辟一个区域,用来存放文件的有关信息(名字,文件状态,当前位置等).这些信息封装在一个文件结构体类型中.每个文件的信息都保存在一个文件结构体指针变量中.

文件结构体是系统定义的,c语言规定该类型为FIILE类型.

typedef struct{

short level;  // 缓冲区满或空的程度
unsigned flags; //文件状态的标志
char fd; //文件描述符
unsigned char hold; // 如没有缓冲区则不读取文件
short bsize; // 缓冲区大小
unsigned char* buffer; // 数据缓冲区的位置
unsigned ar* curp; //指针,当前的指向
unsigned istemp; //临时文件
short token; // 用于有效性检查.
}

可以引用文件类型定义文件类型变量来实现对文件的操作.

FILE *fp;
fopen_s(&fp,"test.txt","w");
fclose(fp);

文件的打开关闭需要配套使用.

文件的使用方式

r只读(打开),r+读写(不存在返回空,读写从头开始,写时覆盖).
w只写(打开或建立文件,内容全部消失).w+读写(打开或新建,读写可以通过位置函数定义)
a追加数据.(打开或新建),a+(读写,位置可以定义) 以上都对文本文件进行操作.
rb,rb+,wb,wb+,ab,ab+都是对二进制文件操作.


文件的读写

// 逐字符读取文件
void R_filechar(const char* ch){

    FILE* pfile;
    fopen_s(&pfile, ch, "r");
    if (pfile == NULL)
    {
        printf("open file error");
    }
    else {
        char cha = fgetc(pfile);
        while (cha != EOF) {
            putchar(cha);
            cha = fgetc(pfile);
        }
        fclose(pfile);
    }
}
// 字符串读取文件
void R_filestr(const char* ch) {
    char a[20];
    FILE* pfile;
    fopen_s(&pfile,ch,"r");
    if (pfile == NULL)
    {
        printf("open file error");
    }
    else {
        int i = 0;
        fgets(a,20,pfile);
        while (i<4)
        {
            printf("%s\n",a);
            fgets(a, 20, pfile);
            i++;
        }
        fclose(pfile);
    }
}
//数据块写入文件(struct)
void W_filestu(const char* ch,Student* pstu) {
    FILE* pfile;
    fopen_s(&pfile, ch, "wb+");
    if (pfile == NULL)
    {
        printf("open file error");
    }
    else {
         fwrite(pstu,sizeof(Student),2,pfile);
        // fprintf(pfile,"%s%d%d%s",pstu->name,pstu->num,pstu->age,pstu->addr);
        fclose(pfile);
    }
}
void R_filestu(const char* ch, Student* qstu) {
    FILE* pfile;
    fopen_s(&pfile, ch, "rb");
    if (pfile == NULL)
    {
        printf("open file error");
    }
    else {
         fread(qstu, sizeof(Student), 2, pfile);
        // fscanf(pfile, "%s\t%d\t%d\t%s",qstu->name,&qstu->num,&qstu->age,qstu->addr);
        for (int i = 0; i < 2; i++, qstu++)
        {
            printf("%s\t%d\t%d\t%s\n", qstu->name, qstu->num, qstu->age, qstu->addr);
        }
        fclose(pfile);
    }
}

当然,最常使用的还是fwrite,fread函数,对结构体进行存取.


文件定位函数

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

文件检测函数


2019.12.25
17:07

上一篇下一篇

猜你喜欢

热点阅读