理解
将数据看作水流,数据读入就是打开水流开关,把水倒进计算机,数据输出就是倒出,可能是倒在显示器上(不太准确),也可能是倒在指定文件里面。
掌握文件就是数据的流动以及关于文件的函数的调用(我认为)。
文件分为文本文件(ascll码字符文件,通常说记事本)和二进制文件
缓冲文件系统(大致原理):
c程序 <--(程序操作)--> (用指针fp实现操作[下面会有])内存缓冲区 <---(操作系统)---> 磁盘
也就是说,程序不是直接作用于磁盘文件的。
再具体说文件
首先先给出一个文件类型指针:
int main(){
FILE *fp;
///
}
FILE 是C语言定义的一个结构体类型(包含在stdio.h 的头文件中)
所以FILE *fp 就是定义一个可以对 文件 进行操作的 结构体指针。
文件操作
- 定义文件指针
- 打开文件
- 文件处理
- 关闭文件
一 . 定义文件指针
FILE *fp;
二 . 打开文件
fp = fopen(“文件名字”,“模式”);
FILE * fopen (const char *filename , const char *mode);
fp=fopen("文件名字","模式");
//通常会有
if(fp==NULL){
perror("fopen");//perror是操作失败的原因的函数
return 1;
}
//或者
if(fp==NULL){
printf("File open error!\n");
exit(0);
}
打开成功返回包含文件信息的缓冲区地址,失败返回NULL。
打开文本文件 :
- "r" : 只能从文件中读数据,该文件必须先存在,否则打开失败
- "w" : 只能向文件写数据,若指定的文件不存在则创建它,如果存在则先删除它再重建一个新文件(大概意思是刷新这个文件重新写入)
- "a" : 向文件增加新数据(不删除原有数据),若文件不存在则打开失败,打开时位置指针移到文件末尾
- "r+" : 可读/写数据,该文件必须先存在,否则打开失败
- "w+" : 可读/写数据,用该模式打开新建一个文件,先向该文件写数据,然后可读取该文件中的数据
- "a+" : 可读/写数据,原来的文件不被删去,位置指针移到文件末尾
只读的话不能对文件进行更改,只能从文件中提取数据出去
打开二进制文件的模式与打开文本文件的含义是一样的,不同的是模式名称里面多一个字母b ,以表示以二进制形式打开文件(例如“rb”,“wb”)。
三 . 文件处理(读写)
C语言标准库stdio.h中提供了一系列文件的读写操作函数,常用的函数如下。
顺序读写:
1.字符方式文件读写函数:fgetc()和fputc():
int fgetc (FILE * stream);
ch = fgetc(fp); //把文件里面的字符赋给ch,如果操作失败,ch=EOF。
//注意不能使用fp++,这并不是跳到文件中的下一个字符,而是下一个 FILE * 指针。
fputc( ch, fp );
int fputc( int character, FILE * stream);
2.字符串方式文件读写函数:fputs()和fgets():
fputs("hello", pf);
int fputs( const char *str, FILE *stream);
fgets 如下
char * fgets (char * str, int num FILE * stream );
3.格式化方式文件读写函数:fscanf()和fprintf():
fprintf (fp , "%类型" , 数据);
int fprintf( FILE* stream , const char * format ,...);
fscanf (fp , "%类型" , 数据地址);
int fscanf ( FIEL * stream , const char *format ,...);
4.数据块方式文件读写函数:fread()和fwrite():
我们在向文件输出数据时都是以文本格式输出的,但是fwrite函数可以直接将计算机内存中所存储的二进制数据输出到文件中(此时此文件就是一个二进制文件)
fwrite ( ptr , size , count , stream );
size_t fwrite ( const void *ptr ,size_t size, size_t count , FIEL * strem );
>ptr:接收指向所要输入数据的指针或地址(也就是读进来的数据的地址)
>size:接收输出的每个数据的大小(以字节为单位)
>count:所要输出数据的个数(也就是这种类型的数据输出的个数)
>stream:接收指向所要输出文件的指针(也就是拿出去的数据的地址)
fread ( ptr ,size , count , stream );
size_t fwrite ( void *ptr ,size_t size, size_t count , FILE * strem );
ptr , size , count , steam 的解释跟以上括号里面的差不多
随机读写
1 . fseek函数(指针偏移):
fseek ( stream , offset , origin );
int fseek ( FILE *stream, long int offset, int origin);
该函数运行成功返回0,否则回非零值
- >stream:传入将要改变的文件指针(文件流)
- >offsrt:传入指针所要偏移的偏移量(有时候为正有时候为负)
- >origin:设置传入的stream指针的起始位置
origin 可传入3种参数:SEEK_SET(从文件的开头开始偏移)、SEEK_CUR(从指针的当前位置开始偏移)、SEEK_END(从文件的结尾开始偏移)
//例如
fseek(stream, 0, SEEK_SET)//将文件指针定位到文件开头
fseek(stream, 10, SEEK_CUR)//将文件指针从当前位置向后移动 10 个字节
fseek(stream, -20, SEEK_END)//将文件指针从文件末尾向前移动 20 个字节
2 . ftell函数( 返回此时文件指针相对于起始位置的偏移量:)
成功后,返回位置指示器的当前值,失败时,返回 -1
ftell(fp);
long int ftell (FILE * stream );
3 . rewind函数(将指针定位到文件起始位置)
void rewind (FILE * stream);
与 fseek (fp , 0 , SEEK_SET)等价
四 . 关闭文件
fclose(fp),如果关闭失败返回EOF。
int feof ( FILE * stream);
//通常会有
if(fclose(fp)!=EOF){
perroer("fclose");
retutn 1;
}
//或者
if(fclose(fp)!=EOF){
printf("Can not close the file!\n);
exit(0);
}
feof函数
用于判断指针是否到达文件尾,是的话就返回EOF,不是的话就返回 0
参考链接:https://blog.csdn.net/m0_70811813/article/details/127218742