C语言编程(九)

今天咱们来看一看C语言文件部分,简单实用!

知识点1【文件的概述】

文件的分类:文本文件 二进制文件
文本文件:是基于字符编码

二进制文件:是基于值编码

文本文件 和 二进制文件的对比:

知识点2【文件指针】

文件的操作步骤:
1、打开文件
2、读写文件
3、关闭文件

知识点3【文件的打开 fopen】

谈一谈mode的格式:

r只读 w只写 a追加 +可读可写 t文本文件(默认省略) b(二进制文件)

文件的关闭

知识点4【一次读写一个字符】

写一个字符:fputc

案例:

void test03()  
{  
 char msg[128]="";  
    printf("请输入你要写入文件的字符串\n");  
    fgets(msg,sizeof(msg), stdin);  
 
 //fopen打开一个文件 
 FILE *fp = fopen("a.txt", "w");  
 if(fp == NULL)  
    {  
        perror("fopen");  
 return;  
    }  
 
 //操作文件fputc 
 int i=0;  
 while(msg[i] != '\0')  
    {  
        fputc(msg[i++], fp);  
    }  
 
 //关闭文件 
    fclose(fp);  }  

运行结果:

a.txt

读一个字符:fgetc

EOF只适用于 文本文件 -1

feof()文本文件 和二进制文件都可以用

案例:

void test04()  
{  
 //以只读的方式打开文件 
 FILE *fp = fopen("a.txt", "r");  
 if(fp == NULL)  
    {  
        perror("fopen");  
 return;  
    }  
 //操作文件 
 char msg[128]="";  
 int i=0;  
 while((msg[i++]= fgetc(fp)) != EOF);  
 
    msg[i-1] = 0;  
    printf("msg = %s\n", msg);  
 
 //关闭文件 
    fclose(fp);  
}  

运行结果:

知识点5【字符串 读写】

写:fputs

void test05()  
{  
 FILE *fp = fopen("a.txt", "w");  
 if(fp == NULL)  
    {  
        perror("fopen");  
 return;  
    }  
 
 char *msg[] = {"床前明月光\n","疑似地上霜\n", "举头望明月\n","低头思故乡"};  
 int n = sizeof(msg)/sizeof(msg[0]);  
 
 int i=0;  
 for ( i = 0; i < n; i++)  
    {  
        fputs(msg[i], fp);  
    }  
 
    fclose(fp);  
}  

运行结果:

读:

void test06()  
{  
 FILE *fp = fopen("a.txt", "r");  
 if(fp == NULL)  
    {  
        perror("fopen");  
 return;  
    }  
 
 char buf[128]="";  
 while(fgets(buf,sizeof(buf), fp))  
    {  
        printf("buf=%s\n",buf);  
    }  
 
    fclose(fp);  
}  

运行结果:

知识点6【文件的块读写】

将内存数据 原样写入磁盘中 将磁盘数据 原样 读取到内存中 不会对数据作任何转换
如果文件 不输出屏幕上 建议 用文件的块读写

写:

typedef struct 
{  
 char name[8];//英雄的姓名 
 int def;//防御 
 int atk;//攻击 
}HERO;  
 
void test07()  
{  
    HERO hero[]= {  
        {"德玛", 90, 40},  
        {"提莫", 30, 120},  
        {"盲僧", 60, 80}  
    };  
 int n = sizeof(hero)/sizeof(hero[0]);  
 
 FILE *fp = fopen("a.txt", "w");  
 if(fp == NULL)  
    {  
        perror("fopen");  
 return;  
    }  
 
 //块写 
    fwrite(hero,sizeof(HERO), n, fp);  
 
    fclose(fp);  
 
}  

运行结果:

读:

#include <string.h> 
void test08()  
{  
    HERO hero[3];  
    memset(hero,0,sizeof(HERO));  
 
 FILE *fp = fopen("a.txt", "r");  
 if(fp == NULL)  
    {  
        perror("fopen");  
 return;  
    }  
 
 //块写 
    fread(hero,sizeof(HERO), 3, fp);  
 int i=0;  
 for ( i = 0; i < 3; i++)  
    {  
        printf("name=%s, def=%d, atk=%d\n", \  
        hero[i].name, hero[i].def, hero[i].atk);  
    }  
 
    fclose(fp);  
}  

运行结果:

案例:fread读到的块数

知识点7【格式化文件读写】按照特定的便于阅读的格式将数据写入文件(方便查看,代价存在数据的转换 效率低)

格式化写:fprintf

void test10()  
{  
    HERO hero[]= {  
        {"德玛", 90, 40},  
        {"提莫", 30, 120},  
        {"盲僧", 60, 80}  
    };  
 int n = sizeof(hero)/sizeof(hero[0]);  
 
 FILE *fp = fopen("a.txt", "w");  
 if(fp == NULL)  
    {  
        perror("fopen");  
 return;  
    }  
 
 //格式化写 
 int i=0;  
 for (i = 0; i < n; i++)  
    {  
        fprintf(fp,"英雄:%s 防御:%d 攻击:%d\n",\  
        hero[i].name, hero[i].def, hero[i].atk);  
    }  
 
    fclose(fp);  
 
}  

运行结果:

格式化读:fscanf

#include <string.h> 
void test11()  
{  
    HERO hero[3];  
    memset(hero,0,sizeof(HERO));  
 
 FILE *fp = fopen("a.txt", "r");  
 if(fp == NULL)  
    {  
        perror("fopen");  
 return;  
    }  
 
 int i=0;  
 for ( i = 0; i < 3; i++)  
    {  
        fscanf(fp,"英雄:%s 防御:%d 攻击:%d\n",\  
        hero[i].name, &hero[i].def, &hero[i].atk);  
    }  
 
 
 for ( i = 0; i < 3; i++)  
    {  
        printf("name=%s, def=%d, atk=%d\n", \  
        hero[i].name, hero[i].def, hero[i].atk);  
    }  
 
    fclose(fp);  
}  

运行结果:

知识点8【文件的随机读写】

引入:顺序读写

1、rewind()复位文件流指针

2、ftell返回文件流指针 距离文件首部的字节偏移量

3、fseek定位文件流指针位置

案例:测量文件的总大小 并一次性读取文件的全部数据
1、使用fseek将文件的流指针定位到文件尾部
2、使用ftell得到文件流指针的偏移量 == 文件的总大小
3、根据文件的总大小 申请堆区空间
4、复位文件流指针rewind
5、一次型读取数据
#include <stdio.h> 
#include <stdlib.h> 
void test01()  
{  
 FILE *fp = fopen("b.txt", "r");  
 
 //将文件流指针定位到文件尾部 
    fseek(fp,0, 2);  
 
 //通过ftell获取文件的总大小 
 long len = ftell(fp);  
    printf("len = %ld\n", len);  
 
 //申请空间 
 char *file = (char *)calloc(1,len+1);  
 
 //复位文件流指针 
    rewind(fp);  
 
 //读取文件数据 
    fread(file,len,1,fp);  
 
    printf("file=%s\n", file);  
 
 //释放堆区空间 
 if(file != NULL)  
    {  
        free(file);  
        file=NULL;  
    }  
 
    fclose(fp);  
}  
int main(int argc, char const *argv[])  
{  
    test01();  
 return 0;  
}  

运行结果:

练习:文件加密(大家可以试试呀)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值