我们日常生活中会将我们制作的ppt,word等存放在文件里进行归类,你是否知道我们能用cC语言对文件进行操作呢(比如文件的打开,关闭和读写等)?那接下来跟博主一起来学习下吧。
磁盘上的文件就是文件,可以理解为一个信息集合体。我们一般根据文件的功能将其分为两类:一类是程序文件,一类是数据文件。
文件名相当于是一个标志,⼀个⽂件要有⼀个唯⼀的⽂件标识,以便⽤⼾识别和引⽤。
小补充:1.文件名可以不包含后缀名,比如.txt文件类型,显示文件扩展名就可以看到
2.文件名后缀表示文件的默认打开方式
3.文件名有一些非法字符,如\ / : * ? " < > |
程序文件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows环境后缀为.exe)。
⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或者输出内容的⽂件。
数据文件按数据的组织形式,一般分为二进制文件和文本文件。数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存,就是⼆进制⽂件。如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件。
类比我们平时喝汽水我们常规步骤是打开瓶子,喝汽水,最后再关闭瓶子。类似地,我们对文件的操作首先是要打开文件,对文件进行输入或输出,最后再关闭文件。我们先来细打开文件和关闭文件。
在介绍打开与关闭文件之前,我们先来普及一个概念叫做流。
流的源来:我们对一个文件可以将他输入屏幕/另一个文件等等不同的设备,这个时候不同设备对你的要求不同。好比一个工厂,我们需要多条生产线,一条分装这种产品,另一条分装那一种产品....我们的流就好比一条生产线分出的多个岔口这些岔口指向不同设备。
C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的.⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后操作。
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
基于之前的理解,我们是用一个文件指针来对文件进行间接维护和操作,所以我们可以推出FILE*类型指针是我们对文件进行读写等操作所必备的,因此我们就可以理解fopen的工作原理了
fopen 这是用来打开文件的函数原型如下
int main()
{
FILE* pf=fopen("data.txt","w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fclose(pf);
pf = NULL;
return 0;
}
文件打开后我们当然要用比如进行读写,fopen第二个参数就是打开方式
注意:对于一个没有存在的文件直接进行读会报错。
我们知道文件里内容是有光标的,顺序读写就指的是这个光标一直往后推进
注意:fread和fwrite只适用于文件流
从函数名可以看出putc是放一个字符,getc是读一个字符
注意:fgets是从流中读取num-1个字符因为还要给\0留位
int main()
{
FILE* pf = fopen("data2.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
/*char arr[20] = "abcdef";
fputs(arr, pf);*/
char name[20] = "xxxxxxxxxxxx";
fgets(name, 7, pf);
printf("%s\n",name);
fclose(pf);
pf = NULL;
return 0;
}
struct S
{
char name[20];
int age;
float score;
};
int main8()
{
struct S s = { 0 };
FILE* pf = fopen("dataa.txt", "r");
//打开文件
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读文件 注意取址符&
fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));
//读pf中数据到结构体
//写入
fprintf(stdout, "%s %d %.1f\n", s.name, s.age, s.score);
//将结构体写入到标准输出流
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
这两个文字是针对二进制文件的,也就是他的读写都是针对二进制。
struct S
{
char name[20];
int age;
float score;
};
int main()
{
struct S s = { "zhangsan",18,99.6 };
FILE* pf = fopen("dataa1.txt", "wb");//二进制写入
if (pf == NULL)
{
perror("fopen");
return 1;
}
fwrite(&s, sizeof(s), 1, pf);
fclose(pf);
pf = NULL;
return 0;
}
我们前面知道顺序指的是光标,那我们能不能让光标随便动读写我们想要的呢?这时就要用到我们的随机读写函数。随机指的是你指哪打哪
fseek是根据根据⽂件指针的位置和偏移量来定位⽂件指针
int main2()
{
FILE* pf = fopen("data2.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
int ch = 0;
ch = fgetc(pf);
printf("%c\n", ch);
ch = fgetc(pf);
printf("%c\n", ch);
ch = fgetc(pf);
printf("%c\n", ch);
//fseek(pf, -3, SEEK_CUR); 从当前位置
//fseek(pf, 3, SEEK_SET); 从开头
fseek(pf, -4, SEEK_END); // 从末尾
ch = fgetc(pf);
printf("%c\n", ch);
long size = 0;
size = ftell(pf);//返回现在光标距起始位置的偏移量
printf("当前偏移量离起始位置为%ld\n", size);
rewind(pf);//使光标回到开头
ch = fgetc(pf);
printf("%c\n", ch);
fclose(pf);
pf = NULL;
return 0;
}
2.ferror
他的作用是判断在文件读取结束后,是否因为遇到错误而结束。
好了本次分享结束啦,喜欢的话给博主来个三连吧~๑ᵒᯅᵒ๑