程序设计中,有两类文件:程序文件,数据文件。
程序文件:.exe,.obj,或工程之内的文件。
数据文件:从类似text.c中读取文件,写文件
文件名包括三个部分:文件路径+文件主干+文件后缀。
文件指针
一个文件的内容在内存中开辟文件信息区,存在一个结构体struct FILE(指向文件信息区)中,结构体中存着文件指针。
fopen文件打开函数 fopen(文件名)或(相对路径+打开方式),返回值为FILE*
fclose文件关闭函数 fclose(FILE*),传参类型为FILE*
两函数都有失败的可能。
文件的读写
文件的顺序读写
fputc(int character,pf)即(输入内容,文件地址)
sprintf,sscanf前者将格式化数据转化成字符串,后者为将字符串中的数据转化为格式化数据。
fgetc函数读取一次会自动跳到下一个字符。
int main()
{
FILE*pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("fopen");
}
else
{
int ch = fgetc(pf);
printf("%c\n", ch);//a
ch = fgetc(pf);
printf("%c\n", ch);//b
ch = fgetc(pf);
printf("%c\n", ch);//c
//如果继续往下读,必然是d
//但是我们调整一下,去读取:b
//fseek(pf, -2, SEEK_CUR);
fseek(pf, 1, SEEK_SET);
ch = fgetc(pf);
printf("%c\n", ch);//b
printf("%d\n", ftell(pf));
rewind(pf);
ch = fgetc(pf);
printf("%c\n", ch);//a
}
return 0;
}
ftell函数是返回相对起始位置的偏移量。
rewind函数可以将文件指针恢复到文件的起始位置,与fseek传参SEEK_SET效果相同。
文本文件和二进制文件
数据在内存中以二进制的形式存储,如果不经转换直接存在文件中就叫二进制文件。
将一个数字的二进制形式的每个字符以ASCII码的形式存储就是文本文件。
文件读取结束的判定
文件读取结束,我们要得知读取结束的原因:
feof:返回真,则是文件读取到了正常的结束标志而结束。
ferror:返回真,则是文件在读取过程中出错了,而结束,属于异常结束。
文件缓冲区
int main()
{
FILE* pf = fopen("test.txt", "w");
fputs("abcdef", pf);//先将代码放在输出缓冲区
printf("睡眠10秒-已经写数据了,打开test.txt文件,发现文件没有内容\n");
Sleep(10000);//10秒
printf("刷新缓冲区\n");
fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到文件(磁盘)
//注:fflush 在高版本的VS上不能使用了
printf("再睡眠10秒-此时,再次打开test.txt文件,文件有内容了\n");
Sleep(10000);
fclose(pf);
//注:fclose在关闭文件的时候,也会刷新缓冲区
pf = NULL;
return 0;
}