跳转至

文件

参考: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