一.文件类型
1文件
磁盘上的⽂件是⽂件。
但是在程序设计中,我们⼀般谈的⽂件有两种:程序⽂件、数据⽂件(从⽂件功能的⻆度来分类
的)。
1.1文件有分为程序文件和数据文件
程序⽂件
包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows 环境后缀为.exe)。
数据文件
⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或 者输出内容的⽂件
1.2数据⽂件还有二进制文件和文本文件之分
二进制文件是之内存的存储方式为二进制方式,不加以转换直接呈现到我们面前的文件
文本文件是二进制存储方式转换成ASCII表符号呈现到我们面前的文件(我们可以看到懂的);
二.文件的打开与关闭
为了方便程序员的打开和关闭文件,程序员不可能把所有的外接设备都了解,于是就有了“流”的出现。
那是因为C语⾔程序在启动的时候,默认打开了3个流:
•
stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。
•
stdout - 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出
流中。
•
stderr - 标准错误流,⼤多数环境中输出到显⽰器界⾯。
这是默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进⾏输⼊输出操作的。
stdin、stdout、stderr 三个流的类型是:
FILE*
,通常称为⽂件指针。
1.文件的打开与关闭要用到文件指针,
//
打开⽂件
FILE *
fopen
(
const char
* filename,
const char
* mode );
//
关闭⽂件
int
fclose
( FILE * stream );
举例子:
文件的打开
FILE* pf = fopen("date.txt",“r”); -->date.txt为文件的开辟,以读的方式打开
文件的关闭
fclose(pf); -->文件的关闭
pf = NULL;
1.1mode表⽰⽂件的打开模式,下⾯都是⽂件的打开模式:
![](https://i-blog.csdnimg.cn/blog_migrate/d961f4f13112608f75c362adf42d8932.png)
![](https://i-blog.csdnimg.cn/blog_migrate/92ac0f9de8f64d62cb86aac01732a220.png)
2.文件的读写方式(顺序读写)
2.1每一个函数的实例
//int main()
//{
// FILE* pf = fopen("date.txt","r");
// if (pf == NULL)
// {
// printf("not");
// return 1;
// }
// //fputc(99,pf);
// printf("%d",fgetc(pf));
// fclose(pf);
// pf = NULL;
// return 0;
//}
//int main()
//{
// char arr[20] = "xxxxxxxxxxxxxxx";
// FILE* pf = fopen("date1.txt", "r");
// if (pf == NULL)
// {
// printf("not");
// return 1;
// }
// //fputs(arr,pf);
// fgets(arr,4,pf);
// for (int i = 0; i < 20; i++)
// {
// printf("%c",arr[i]);
// }
// fclose(pf);
// pf = NULL;
// return 0;
//}
//
//struct p
//{
// char num[20];
// int age;
// float h;
//};
//int main()
//{
// struct p a = {0};
// FILE* pf = fopen("date1.txt","r");
// if (pf == NULL)
// {
// printf("not");
// }
//
// /*fprintf(pf,"%s %d %f",a.num,a.age,a.h);*/
//
// /*fscanf(pf,"%s %d %f",a.num,&(a.age),&(a.h));
// printf("%s %d %f", a.num, a.age, a.h);*/
//
// fclose(pf);
// pf = NULL;
// return 0;
//}
//struct p
//{
// char num[20];
// int age;
// float h;
//};
//int main()
//{
// struct p a[] = {0};
//
// FILE* pf = fopen("date2.txt", "rb");
// if (pf == NULL)
// {
// printf("not");
// fclose(pf);
// }
// /*fwrite(&a, 1, sizeof(a), pf);*/
// fread(&a,1,sizeof(a),pf);
// printf("%s %d %.1f",a->num,a->age,a->h);
//
// fclose(pf);
// pf = NULL;
// return 0;
//
//}
三.文件的随机读写
1.根据⽂件指针的位置和偏移量来定位⽂件指针。fseek
int
fseek
( FILE * stream,
long int
offset,
int
origin );
![](https://i-blog.csdnimg.cn/blog_migrate/702d0d5f2f0f0eef162be44eb4aaa673.png)
实战例子
int main()
{
FILE* pf = fopen("date.txt","r");
if (pf == NULL)
{
printf("iii");
}
//printf("%c\n", fgetc(pf));
//printf("%c\n", fgetc(pf));
fseek(pf,5,SEEK_SET);
printf("%c\n", fgetc(pf));
fclose(pf);
pf = NULL;
return 0;
}
2.返回⽂件指针相对于起始位置的偏移量 ftel
long int
ftell
( FILE * stream );
实战例子
int main()
{
FILE* pf = fopen("date.txt", "r");
if (pf == NULL)
{
printf("iii");
}
//printf("%c\n", fgetc(pf));
//printf("%c\n", fgetc(pf));
fseek(pf, 5, SEEK_SET);
int a = ftell(pf);
printf("%c\n", fgetc(pf));
printf("%d",a);
fclose(pf);
pf = NULL;
return 0;
}
3.让⽂件指针的位置回到⽂件的起始位置 rewind
void rewind ( FILE * stream );
实战例子
int main()
{
FILE* pf = fopen("date.txt", "r");
if (pf == NULL)
{
printf("iii");
}
//printf("%c\n", fgetc(pf));
//printf("%c\n", fgetc(pf));
fseek(pf, 5, SEEK_SET);
printf("%c\n", fgetc(pf));
int a = ftell(pf);
rewind(pf);
printf("%c\n", fgetc(pf));
printf("%d", a);
fclose(pf);
pf = NULL;
return 0;
}