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

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

  • 文件的基本概念:数据流,缓冲区,文件类型,文件存取方式
  • 文件的打开和关闭: fopen,fclose
  • 文本文件读写操作: fgetc,fputc,fgets,fputs,fscanf,fprintf 函数
  • 二进制文件读写操作: fwrite,fread 函数
  • 文件的定位函数: rewind,fseek,ftell 函数
  • 文件检测函数: feof,ferror,clearerr 函数

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

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

  • 二进制文件与ASCll码文件

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

  • 缓存区是程序执行时,系统提供的额外内存.用来存储准备执行的数据.它的设置是为了提高存取效率.内存的存取比磁盘驱动器快多了.c语言标准i/o函数(包含在stdio,h中).系统会自动设置缓存区.

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

  • 文件的存取方式主要分两种;顺序存取和随机存取

  • 文件类型指针

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

文件结构体是系统定义的,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+都是对二进制文件操作.


文件的读写

  • fgetc 逐字符读取.fputc逐字符写入:
// 逐字符读取文件
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);
    }
}
  • fgets与fputs 逐字符串读取函数:
// 字符串读取文件
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);
    }
}
  • fwrite与fread函数,以数据块为单位的二进制文件读取函数.和格式化读写函数:fscanf,fprintf:(比较常用的)
//数据块写入文件(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函数,对结构体进行存取.


文件定位函数

  • rewind(文件指针): 返回当文件头部.

  • fseek(文件指针,位移量,起始点), 位移量指的是以字节为单位.起始点表示从何处计算位移量:

起始点 表示符号 数字表示
文件首 SEEK_SET 0
当前位置 SEEK_SET 1
文件尾 SEEK_SET 2
  • ftell函数,用来得到文件位置指针当前位置相对于文件首偏移的字节数.通常配合fseek函数.

文件检测函数

  • feof()函数. 用来检测文件位置指针是否处于文件结束位置.通常用来做遍历文件的判断条件.是一个经常使用到的函数.到达返回true,否则返回false.

  • feeror(),读写文件是否出错的检测函数,返回0表示未出错,否则有错.


2019.12.25
17:07

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容