文件
参考:C语言菜鸟笔记
1.文件类型指针
FILE *fp;
FILE是文件结构类型定义符,fp是文件结构指针
文件类型不像以前普通指针那样能进行fp++或*fp等操作,fp++意味着指向下一个FILE结构(如果存在)。
2.打开文件和关闭文件
打开文件fopen()
可以使用 fopen( ) 函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型 FILE 的一个对象,类型 FILE 包含了所有用来控制流的必要的信息。下面是这个函数调用的原型:
FILE *fopen( const char *filename, const char *mode );
fopen("文件名","文件打开方式");
在这里,filename 是字符串,用来命名文件,访问模式 mode 的值可以是下列值中的一个:
模式 | 描述 |
---|---|
r | 打开一个已有的文本文件,允许读取文件。 |
w | 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。 |
a | 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。 |
r+ | 打开一个文本文件,允许读写文件。 |
w+ | 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。 |
a+ | 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。 |
Windows系统,r方式会把回车'\r'和换行'\n'合成一个字符
如果处理的是二进制文件,则需使用下面的访问模式来取代上面的访问模式:
"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"
说明:
(1)该函数有返回值,执行成功,返回文件缓冲区等信息的FILE结构地址,否则返回一个NULL的FILE指针
(2)"文件名"一般要指出路径,不写路径默认与应用程序当前路径相同。若写路径必须包含绝对完整路径,且要用双斜杠" \ \ "
(3)为确保文件操作可靠性,可以加一个判断
if ((fp=fopen("abc.txt","r"))==NULL)
{
printf("error");
exit(0);
}
exit(0)关闭所有打开的文件,并终止程序执行。参数0表示正常结束,非0表示不正常结束。
(4)文件打开后在文件关闭前操作方式不能改变
关闭文件fclose()
int fclose( FILE *fp );
如果成功关闭文件,fclose( ) 函数返回零,如果关闭文件时发生错误,函数返回 EOF。这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。EOF 是一个定义在头文件 stdio.h 中的常量。
3.文件读写
字符方式:fgetc()和fputc()
fgetc(FILE *fp1);
fgetc(FILE *fp2);
fgetc()从文件中读取一个char类型变量,读完一个元素自动移动一格。fputc()向文件中写入一个char类型变量
fgetc()当强行读成EOF处的内容会返回EOF即-1
fgetc()写文件成功返回读取的元素,写文件失败返回EOF。读到文件末尾,会读到无效字符,返回EOF
字符串方式:fgets()和fputs()
fputs(s,fp)
s是要写入的字符串,可以是字符数组名、字符型指针变量或字符串常量,fp是文件指针。把s写入文件时,'\0'不写入。函数执行成功,返回最后一个字符,否则返回EOF
注意fputs()并不会像puts()那样在末尾多输出一个'\n', 它只输出字符串中'\0'左边的内容。
fgets(s,n,fp)
从文件fp中读取一行以'\n'结尾的字符串并保存到数组s中。n为指定读入字符的个数。
最多读取n-1个字符,达到指定个数,接收到换行符或接收到结束标志EOF,在读取的字符后自动加'\0'。若有换行符,则换行符保留,若有EOF,不保留EOF。执行成功,返回读取的字符串,否则返回空指针
fgets()的第1个参数表示缓冲区的地址,该缓冲区用来保存读出来的字符串;第2个参数表示缓冲区的长度,此长度用来限制读出来的字符串中包含的字符个数,假设此参数为n,那么最多只读取n-1个字符,因为缓冲区中的最后一个字节要保留给'\0';第3个参数是文件指针。当字符串长度(含'\n') <= n-1时, fgets()会读取该字符串的全部内容;当字符串长度 > n-1时,fgets()仅读取字符串前n-1个字符。fgets()在读取一行内容后会自动在该字符串末尾补上 '\0'。注意fgets()并不会像gets()那样丢弃字符串末尾的'\n', 它会把'\n'也读进来。当fgets()成功读取字符串时,会返回一个指针指向读到的内容;当fgets()读取EOF处的内容时会返回空指针NULL。
格式化方式:fscanf()和fprintf()
FILE *fp1,*fp2;
int n;
float x;
fscanf(fp1,"%d%f",&n,&x);
fprintf(fp2,"%d%f",n,x);
数据块方式读写函数:fread()和fwrite()
char p[100];
fread(p,1,n,fp); //读取fp文件中的n个字节保存到p指向的内存的内存块中
fwrite(p,1,n,fp); //把p指向的n个字节写入到文件中
4.其他相关函数
rewind()
定位文件读写位置指针,使其指向读写文件的首地址。
rewind(FILE *fp);
fseek()
fseek(fp,offset,from)
offset为移动偏移量,long型数据,常量要加上后缀"L"
from为从哪个位置开始偏移,from=0——文件首部,from=1——当前位置,from=2——文件尾部
成功返回0,失败返回非0
ftell()
fseek(fp,0,SEEK_END); //把文件指针移到EOF处
long len=ftell(FILE *fp); //返回当前指针与文件首字节处的距离,即文件长度
获取当前文件读写文件位置指针的位置,即相对于文件开头的偏移量
feof()
判断是否已经达到文件末尾,即文件内容末字节的后面那个位置
feof(fp)一定要等到程序中有语句去尝试读一次EOF处的不存在的char之后才会返回1
返回1表示已到达,0表示未到达
ferror()
检查文件在各种输入输出函数读写是否出错
clearerr()
清除出错标志和文件结束标志,使它们为0