C文件操作File

为什么要使用文件呢? 因为我们的数据写到文件里可以持久化,会一直保留着

比如我们做一个通讯录系统每次打开就得重新输入信息,我们就可以使用文件输入信息实现可持久化,这样下次打开数据就不会消失了

首先了解 一下文件指针:每个被使用的文件都在内存中开辟了一个相应的文件信息区,这些信息区是用来存放文件相关的信息(比如文件名,文件的状态,文件的位置等等)。这些文件是保存在一个结构体变量中的,那这个结构体类型是由系统声明的,并且取名叫做FILE。

每当打开一个文件的时候,系统会根据文件情况自动去创建一个FILE结构的变量,并填充其中的信息,使用者不必关系细节,一般都是通过一个FILE的指针来维护这个FILE结构的变量,使用起来会更加方便。

创建一个FILE*的指针变量:FILE* pf;

定义pf是一个指向FILE类型数据的指针变量,可以使pf指向某个文件的文件信息区(是一个结构体变量),通过该文件信息区的信息就可以访问该文件,也就是说:通过文件指针变量可以找到与它相关联的文件。

FILE* fopen(const char*filename,const char* mode) 一个是文件名 一个是打开文件的方式

 

字符输入函数        fgetc        适用于所有输入流

字符输出函数        fputc        适用于所有输出流

文本行输入函数         fgets        适用于所有输入流

文本行输出函数        fputs        适用于所有输出流

格式化输入函数        fscanf       适用于所有输入流

格式化输出函数        fprintf        适用于所有输出流

二进制输入        fread                适用于文件

二进制输出        fwrite                适用于文件

 /*
    * 只有一个C程序运行起来,这三个流就会默认开启  类型为FILE*
    标准输入流  stdin(键盘)
    标准输出流  stdout(屏幕)
    标准错误流  stderr(屏幕)
    */

比如:FILE* pf = fopen("test.txt","r"); 读文件test.txt的内容 如果文件不存在则打开失败 返回NULL

 //可以使用绝对路径或者相对路径

      //FILE* pf = fopen("test.txt", "w");  //写文件
    //if (pf == NULL) {
    //    perror("fopen");
    //    return 1;
    //}
    写文件
    //char ch = 'a';
    //for (ch; ch <= 'z'; ch++) {
    //    fputc(ch, pf);//写a到z-->(ch)到pf这个流当中
    //}
    关闭文件
    //fclose(pf);
    //pf = NULL;

    //FILE* pf = fopen("test.txt", "r");  //读文件
    //if (pf == NULL) {
    //    perror("fopen");
    //    return 1;
    //}
    读文件
    //int ch = 0;
    //while ((ch=fgetc(pf)) != EOF) {  //从ch中读出所有的字符
    //    printf("%c ", ch);
    //}
    关闭文件
    //fclose(pf);
    //pf = NULL;

 //fgetc和fputc是字符输入和字符输出函数 面对的是一个字符

以上都是以一个字符为单位的 我们想读一行或者写一行的话就要使用fputs,fgets

打开文件
    //FILE* pf=fopen("test.txt", "w");//把之前的文件内容清空了
    //if (pf == NULL) {
    //    perror("fopen");
    //    return 1;
    //}
    写一行文件
    //fputs("QWERTYUIOP\n", pf);
    //fputs("XXXXXXXXXX\n", pf);

    关闭文件
    //fclose(pf);
    //pf = NULL;

//打开文件
    // char* fgets(char* string,int n,FILE* stream);
    // strint:数据的存储位置
    // n:读取字符的最大个数
    // stream:从哪里读
    //FILE* pf = fopen("test.txt", "r");
    //if (pf == NULL) {
    //    perror("fopen");
    //    return 1;
    //}
    //char buff[256] = {0};
    读一行文件
    fgets(buff, 256, pf);
    printf("%s", buff);
    fgets(buff, 256, pf);
    printf("%s", buff);
    //
    //while (fgets(buff, 256, pf) != NULL) {
    //    printf("%s", buff);
    //}
    关闭文件
    //fclose(pf);
    //pf = NULL;

//要写入一个结构体或者读入结构体就fprintf或者fscanf
struct S
{
    char name[20];
    int age;
    double dou;
};  

//struct S s = { "张三",20,99.99 };
    打开文件
    //FILE* pf=fopen("test2.txt", "w");
    //if (pf == NULL) {
    //    perror("fopen");
    //    return 1;
    //}
    // 
     写文件
    //fprintf(pf, "%s %d %lf", s.name,s.age, s.dou);//把结构体内的数写道文件里面
    //fclose(pf);
    //pf = NULL;

  //struct S s = {0};
    打开文件
    //FILE* pf=fopen("test2.txt", "r");
    //if (pf == NULL) {
    //    perror("fopen");
    //    return 1;
    //}
    读文件
    适用于所有输入流
    //fscanf(pf, "%s %d %lf", s.name, &(s.age), &(s.dou));//从pf文件中读取结构体内容
    printf("%s %d %lf", s.name, s.age, s.dou);//打印出来
    //fprintf(stdout,"%s %d %lf", s.name, s.age, s.dou);//适用于所有输出数据流
    //fclose(pf);
    //pf = NULL;

如果是二进制的读取或写入使用fread或者fwrite

//struct S s = { "张三",20,99.9 };
//FILE* pf = fopen("test3.txt", "wb");
//if (pf == NULL) {
//    perror("fopen");
//    return 1;
//}
以二进制写文件
//fwrite(&s, sizeof(struct S), 1, pf); 写结构体s的内容到pf中
//fclose(pf);
//pf = NULL;


struct S s = { "张三",20,99.9 };
FILE* pf = fopen("test3.txt", "rb");
if (pf == NULL) {
    perror("fopen");
    return 1;
}
//以二进制读文件
fread(&s, sizeof(struct S), 1, pf);
printf("%s %d %lf \n", s.name, s.age, s.dou);
fclose(pf);
pf = NULL;

    return 0;
}

/*
    scanf          格式化的输入函数
    printf          格式化的输出函数
    fscanf         针对所有输入流的格式化的输入函数
    fsprintf        针对所有输出流的格式化的输出函数
    sscanf         把一个字符串转换成格式化的数据
    ssprintf        把一个格式化的数据转换成字符串
    */

       //char buff[256] = { 0 };
       //struct S s = { "张三",20,99.99 };
      //struct S tmp = { 0 };
      //sprintf(buff, "%s %d %lf", s.name, s.age, s.dou);//将格式化的数据转化成字符串存放在buff中
      //printf("%s\n", buff);

      从buff字符串中提取结构体数据
      //sscanf(buff,"%s %d %lf", tmp.name, &(tmp.age), &(tmp.dou));
      //printf("%s %d %lf", s.name, s.age, s.dou);

//使用fwrite或者使用fread进行对文件二进制的输入输出

//size_t fwrite(const void* buffer,size_t size,size_t count,FILE *stream)
// buffer:要写的数据
// size:元素的大小
// count:最多要写几个元素
// stream:从哪写
//struct S s = { "张三",20,99.9 };
//FILE* pf = fopen("test3.txt", "wb");
//if (pf == NULL) {
//    perror("fopen");
//    return 1;
//}
以二进制写文件
//fwrite(&s, sizeof(struct S), 1, pf);
//fclose(pf);
//pf = NULL;

//size_t fread(const void* buffer,size_t size,size_t count,FILE *stream)
//struct S s = { };
// 读文件 以二进制的方式读
//FILE* pf = fopen("test3.txt", "rb");
//if (pf == NULL) {
//    perror("fopen");
//    return 1;
//}
以二进制读文件
//fread(&s, sizeof(struct S), 1, pf);
//printf("%s %d %lf \n", s.name, s.age, s.dou);
//fclose(pf);
//pf = NULL;
//
//    return 0;
//}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值