文件
-
读文件:将数据从磁盘读取至内存上
-
写文件:数据内存存放在磁盘文件上
-
数据的输出和输入都是站在内存的前提之上,而非单纯文件的角度。
文件的类型
二进制文件;字符文件:就是一个单纯的输入输出的事情。
文件的操作步骤
-
调用<stdio.h>
-
定义文件的指针
-
打开文件
-
对于文件进行处理-写入
-
关闭文件
c语言中的文件操作其实都是通过调用标准函数的方式形成的,因而c语言的文件操作统一由文件指针的方式进行实现。
定义文件指针:FILE *fp;
c程序中只使用文件指针fp,使用fp来代表文件的整体。(文件指针不像以前普通的指针那样能够进行fp++或者fp等操作,fp++表示的是指向下一个文件结构*(其实这个也不难理解,就是你使用FILE来定义了一个指针,那么fp++就会加上一个FILE的空间,从实际的情况上来看,就是做到了指向下一个的文件。
文件具体操作流程解析
打开文件和关闭文件
文件一般的调用形式为:fopen("文件名","文件打开方式");
-
该函数是有返回值的:如果执行成功,则函数会返回一个包含文件缓冲区信息的FILE结构的地址,如果执行失败,会返回一个NULL的指针(我们用来判断的方法)
-
文件名记得加上后缀,并且输入文件名的时候可以加上文件的地址,就是其中的
“\”
要转化为“\\”
-
一旦文件使用fopen打开,则对于该文件的操作方式就是已经固定的了,直到最后文件关闭的时候都不会改变,例如如果文件使用r的方式进行展开,那么就只能对于文件进行一个只读的操作,而不能进行写入数据的操作。
文件使用方式 | 含义 | 如果指定文件不存在 |
---|---|---|
“r”(只读) | 为了输入数据,打开一个已经存在的文本文件 | 出错 |
“w”(只写) | 为了输入数据,打开一个已经存在的文本文件 | 建立一个新的文件 |
“a”(追加) | 向文本文件尾添加数据 | 建立一个新的文件 |
“r+”(读写) | 为了读和写,打开一个文本文件 | 错误 |
“w+”(读写) | 为了读和写,建立一个新文件 | 建立一个新文件 |
“a+”(读写) | 打开一个文件,在文件尾进行读写 | 建立一个新文件 |
二进制文件操作与文本文件的操作是一致的就是把所有的打开方式前面都加上了一个字符b作为后缀。
if((fp=fopen("prime.txt","w"))==NULL) {//对于文件进行展开,这里是有了一个特判,如果文件无法打开将会返回一个error;
printf("Fire Open error!");
exit(0);//是系统标准函数,作用是关闭所有已经打开的文件,并且终止程序的进行
}
在打开文件的时候有这样的一步fp=fopen(".txt","s")
这样的过程,也就是说c程序与电脑磁盘.txt的文件通过fp这个文件指针建立了联系,之后对于文件的种种操作都要与这一个文件指针互相关联才可以。
文件关闭的形式 fclose(文件指针);
`if(fclose(fp)) {
//对于文件进行一个关闭的行为,如果文件关闭成功,则之后值返回零,如果最后返回失败,则返回一个EOF,然后进入这个if语句之中 printf("Can not close the file!\n");
exit(0);
// }`
文件的的读写方式
-
字符文件的读写函数:fgetc( )和fputc();
-
字符串文件的读写函数:fgets( )和fputs();
-
格式化方式文件的读写函数:fscanf( )和fprintf();
-
数据块方式文件的读写函数:fread( )和fwrite();
正如分段标题讲的那样,这里函数的功能仅限于读和写!!!
字符文件的读写
ch=fgetc();
//从fp所示的文件上面读入一个字符到ch;
fputc(ch,fp);
//把一个字符写在文件上面。如果写入失败会返回EOF
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp1,*fp2;
char ch;
if((fp1=fopen("prime.txt","r"))==NULL)
{
printf("FILE can't open");
exit(0);
}
if((fp2=fopen("prime3.txt","w"))==NULL)
{
printf("FILE can't cpen");
exit(0);
}
while(1)
{
ch=fgetc(fp1);
f(ch==EOF) break;
//直接进行一个简单粗暴的判断对于字符进行一个判断;EOF是文件结束符,不是常规的ASCII码,而是一个用来区分字符内容的
fputc(ch,fp2);
}
}
字符串文件的读写
fgets(s,n,fp);
-
s可以为数组字符名或者字符指针(指向字符串的指针)
-
n为读入字符的数目
-
fp为文件的指针
在函数调用的时候,最多读取n-1个字符并且将读入的字符串储存在s里面;
当函数读取到规定数量的字符或者读取到EOF的时候,将在读取的字符的后面加上一个'\0'的字符。
会保留'\n',不会保留EOF
如果执行成功会返回一个字符串,执行不成功会返回一个空指针
fputs(s,fp);
-
s是要写入的字符串(可以是字符数组的名、字符型指针变量、字符串常量)
-
fp是文件指针
-
把s写入文件的时候,字符串的结束'\0'不写入文件,如果函数执行成功函数返回所写的最后一个字符;否则函数返回一个EOF。
格式化方式对于文件内容进行读写
fscanf(fp,"%d%f",&n,&f);
fprintf(fp,"%d%f",&n,&f);
格式化输入输出其实可以从函数中间的scanf和printf中间就可以看出一点端倪出来。
其他相关的文件函数
-
重定位文件首函数rewind(fp)
定义完文件指针之后,在读和写的过程中文件指针会在在文件上面不断地移动。使用这个rewind函数就可以把文件指针重新回到文件的开头位置
-
指针控制移动函数fseek(fp,offest,from);
-
offest是移动偏移量,是long型数据,使用常量的时候,应当加上后缀L,正值的时候向后运动,负值的时候向前运动
-
from是从哪一个位置开始计算偏移量。有三种位置:0(文件首部),1(指针的当前位置),2(文件的尾部);
-
-
获取指针当前位置的函数ftell(fp);
获取指针当前的读写位置,即相对于文件开头的偏移量。
-
文件末尾判断函数feof(fp);
用于判断文件指针是否已经到了文件的末尾,即文件是否读到了文件结束的位置;
-
读写错误检查函数ferror(fp);
检查文件再用各种各样的输入输出函数进行读写的时候是否出错,若返回值为0,表示为未出错,不为0则表示为出错。
-
出错标记清楚函数clearer(fp);
用来清除出错的标志和文件结束的标志,使得他们的值变为0;