波奇学c:文件操作

文件:程序文件:(.c/.obj/.exe)数据文件:程序运行时的数据或内容

文件名:文件路径+文件名主干+文件后缀

c:\code\test.txt

文件指针

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件相关信息(文件名字,文件状态以及当前位置),信息是被保存在结构体FILE的变量中,一个文件一个变量。

FILE的定义

波奇学c:文件操作_第1张图片

通过FILE*文件指针来维护文件

文件的打开和关闭

打开文件:fopen("文件路径","模式");

关闭文件:fclose("文件指针");

FILE*pf=fopen("D:\\code\\test.txt","r");//打开文件模式是只读
//打开成功返回FILE指针,指针指向开辟的结构体FILE变量
//打开失败返回空指针
FILE*pf=fopen("test.txt","r");//相对路径:和源文件在同一目录
FILE*pf=fopen("..\test.txt","r");//在源文件上一级目录
fclose(pf);//关闭文件,参数是FILE*指针
波奇学c:文件操作_第2张图片

用双横线来防转义。

波奇学c:文件操作_第3张图片

打开文件的模式

"r":只读。

"w":清空原来的文件,并写入,如果是无文件就创建。

"a":打开文件,从文件尾改变文件。

"r+":可读和可修改,文件必须存在。

"w+":和"w"一样

"a+":追加文件

文件顺序读写

fputc(字符,FILE指针):写入字符到文件中

FILE*pf=fopen("D:\\code\\test.txt","w");
fputc('a',pf);
//按顺序写入

fgetc(FlLE*):返回读到的字符的assic码值,读取失败和读取结束都返回EOF

FILE*pf=fopen("D:\\code\\test.txt","r");
int ch=fgetc(pf);
printf("%c",ch);
//fputc和fgetc是逐个字符读写

fputs("字符串",FILE*):写入字符串到文件中

int fputs ( 写入的字符串地址, 文件指针 );

成功返回非负数,失败返回EOF

FILE*pf=fopen("D:\\code\\test.txt","w");//使文件可读
fputs("ahlgaglj\n",pf);
//写入ahlgaglj并换行

fgets:读取文件字符串并写入内存

char * fgets ( 写入的字符串地址, 读取字符数, 文件指针 );

FILE*pf=fopen("D:\\code\\test.txt","r");
char ch[20]={0};
fgets(ch,5,pf);//读取4个字符并放入ch中,并补上

fprintf:输出数据到文件流中

fprintf(文件指针,"输出格式",变量名);

FILE*pf=fopen("D:\\code\\test.txt","w");
int a=0;
int b=0;
fprintf(pf,"%d%d",a,b);//除了多了指针作为第一个参数其他和printf一样

fscanf:从文件流中输出到内存中

fscanf(文件指针,"输出格式",地址);

FILE*pf=fopen("D:\\code\\test.txt","r");
fscanf(pf,"%d%d",&a,&b);//从文件中读取数据

fprintf和fscanf:相当于与程序互动的主体由人变成了文件

数据输入->流->不同对象:屏幕,文件,网络(给他人发信息)。

流就是FILE的结构体。

任何一个c语言程序运行默认打开三个流:

stdin-标准输入(键盘)FILE*(键盘输入数据到内存中)

stdout-标准输出 (屏幕) FILE*(内存输出数据到屏幕上)

stderr-标准错误  (屏幕) FILE*(程序的错误信息到屏幕上)

机器一般自带标准流,不含文件流,所以要手动打开fopen,才能从文件流中输出获取。

以上的函数适应所有的流:如fgetc()即fgetc()可以从文件流获取字符也可以从标准输入输流(用普通指针)出,printf()/scanf()只能用标准输入输出流。

二进制输入输出(只能文件流)

fread/fwrite:以二进制来读写

fwrite(变量地址,操作大小,操作个数,文件指针)

FILE*pf=fopen("D:\\code\\test.txt","wb");\\二进制读写
int a=4;
fwrite(&a,sizeof(a),1,pf);\\把a地址指向的内容写入文件中
\\要写的数据的地址,写入字符的大小,写入数量,目标指针
fread(&a,sizeof(a),1,pf)\\把文件中的内容写入a中
\\读到的数据放入地址,读取数据的大小,读入的数量,

函数scanf/fscanf/sscanf比较:printf/fprintf/sprintf同理

scanf针对标准输入流, fscanf针对所有输入流,sscanf:读取字符串中格式化的数据并写入到内存中

sscanf(buf,”%d”,&a);
//从字符串指向的内容输入到a变量中

文件随机读写

fseek:偏移指针

向左偏移为负,向右为正 

fseek(pf,1,SEEK_SET);
//指针,偏移量,偏移起始位置
//SEEK_SET:表示当前位置
//每次用fgetc等函数时,指针会自动偏移到下一个字符

SEEK_SET

Beginning of file

SEEK_CUR

Current position of the file pointer

SEEK_END

End of file *

ftell:告诉相对于起始位置的偏移量

ftell(pf);

rewind:使指针返回起始位置

rewind(pf);

数据在内存中以二进制存储,把二进制数据存到文件中就是二进制文件

如果转换为assic码值再存到文件中,就是文本文件。

如果在内存中小端形式,那么二进制文件也是也是小端

文件读取结束判定

文本文件

fgetc

返回空指针:读取失败而导致读取结束

返回EOF:读到文件为尾而结束

feof:已结束时,判断结束原因

返回假:读取失败结束,还是返回真:文件尾结束

二进制文件

返回值是否小于实际读取个数

文件缓存区

系统为内存中为使用的文件开辟文件缓存区。

文件数据->输入/输出缓冲区->内存

当缓冲区满了时或主动刷新缓冲区,文件和内存才进行数据交换。

你可能感兴趣的:(波奇学c,c语言)