C文件操作File

  • Post author:
  • Post category:其他


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

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

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

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;

//}



版权声明:本文为m0_63101235原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。