【C】C语言处理文件读写

来源:互联网 发布:东莞pmp培训 知乎 编辑:程序博客网 时间:2024/06/06 03:03

文件的概念

能够存储数据的存储设备叫做文件,文件通常存储到硬盘上。文件其实是一系列的字节。


文件中的位置

文件有开头和结尾,还有一个当前位置,通常定义为从文件头到当前位置有多少个字节。

当前位置就是发生文件操作(读写文件的动作)的地方。

新的当前位置可以指定为距离文件开头的偏移量,或在某些情况下,指定为从前一个当前位置算起的正或负偏移量。又是还可以把当前位置移到文件尾。


文件流

流是外部数据或数据目的地的抽象表示,所以键盘、显示器上的命令行和磁盘文件都是流。

将数据写入流(即磁盘文件)有两种方式。首先,可以将数据写入文本文件,此时数据写入为字符,这些字符组织为数据行,每一行都用换行符结束。其次,可以将数据写入二进制文件。无论将数据写入文本文件还是二进制文件,不论它们是什么样的数据,这些数据最终都是一系列字节。


文件访问

头文件<stdio.h>


打开文件


fopen()

原型:FILE *fopen(const char *restrict name,const char *restrict mode);

参数:第一个变元是字符串指针,它是要处理的外部文件名称,它包含了文件名称字符串的地址。第二个变元也是一个字符串,称为文件模式,它指定对文件进行什么处理。

返回值:如果成功调用,则返回一个File*类型的指针,否则返回NULL。

模式:"w"进行写入操作。如果文件存在,就删除其当前内容。

           "a"进行追加操作,写入的数据放在文件尾。

           "r"进行读取操作。


fopen_s()

原型:errno_t fopen_s(FILE *restrict *restrict pfile,const char *restrict name,const char *restrict mode)

参数:第一个参数是FILE结构指针的指针,所以把存储文件指针的FILE*变量地址传递为第一个变元。

返回值:如果正常,就返回0,否则返回非0整数。在后一种情况下,文件指针会设置为NULL。


缓存文件


setvbuf()

原型:int setvbuf(FILE *restrict pfile,char *restrict buffer,int mode,size_t size)

参数:第一个参数是打开文件的文件指针。第二个参数指定一个用于缓存的数组,第四个参数是该数组的大小。如果把NULL指定为第二个变元,就用第四个变元指定的大小分配一个缓存。第三个变元指定缓存模式,其值可以是:_IOFBF使文件完全缓存;_IOLBF使操作缓存一行;_IONBF使输入和输出不缓存。

返回值:一切正常返回0,否则返回非0整数。


setbuf()

原型:void setbuf(FILE *restrict pfile,char *restrict buffer)

参数:第一个单数是文件指针,第二个参数是用作缓冲区的数组地址。第二个变元可以是NULL,此时会自动创建缓冲区。如果指定缓冲区,其长度就必须是BUFSIZ字节,BUFSIZ在stdio.h中定义。


文件重命名


rename()

原型:int rename(const char *oldname,const char *newname)

返回值:如果文件名更改成功,就返回整数0,否则返回非零值。

注意:调用rename()函数时,文件必须关闭,否则操作就会失败。


关闭文件


fclose()

调用fclose()函数的结果是断开指针pfile和物理文件名间的连接,因此pfile不能再用于访问它表示的文件。

使用方式:fclose(pfile);pfile=NULL;

返回值:如果成功关闭文件,就返回0,否则返回EOF。


ffflush()

fflush()函数可以迫使留在缓冲区的数据写入文件。

使用方式:fflush(pfile);

返回值:正常时返回0,否则返回EOF。


删除文件


remove()

在调用remove()函数时,文件不应是打开的

使用方式:remove("myfile.txt");


写入文本文件

打开一个文件以用于写入数据后,就可以在程序的任何地方给它写入数据,只要可以访问fopen_s()为文件设置的文件指针即可。


fputc()

fputc()函数将一个字符写入文本文件

原型:int fputc(int ch,FILE *pfile)

参数:将第一个变元指定的字符写入第二个变元(文件指针)指定的文件中。

返回值:如果操作成功,就返回写入的字符,否则返回EOF


读取文本文件


fgetc()

fgetc()函数从打开的文本文件中读取一个字符。它将文件指针作为唯一的变元,把读取的字符返回int类型。
用法:int mchar = fgetc(pfile);
返回值:mchar变量int类型,因为如果到达文件尾,就返回EOF。

还可以在需要时再次读取文件的内容。rewind()函数把文件指针变元指定的文件定位在开头。用法:rewind(pfile)。文件必须打开。

在文本文件中读写字符串


fgets()

fgets()会从pfile所指向的文件将字符串读入str所指向的内存。该函数会一直从文件中读取字符串,知道读到了'\n'字符或读入nchars-1个字符为止。如果读到换行符,它会保留在字符串中。字符'\0'会附加到字符串的末尾。

原型:char *fgets(char * restrict str,int nchars,FILE * restrict pfile)

返回值:如果正常,返回str指针,否则返回NULL。读取EOF时会返回NULL。


fputs()

fputs()函数将字符串写入文件,知道碰到'\0'字符为止,但是'\0'不会写入文件。

原型:int fputs(const char * restrict str,FILE * restrict pfile)

参数:第一个变元是要写入文件的字符串指针,第二个变元是文件指针。

返回值:如果正常就返回正整数,否则返回EOF


格式化文件的输入输出


格式化文件输出

格式化输出的标准函数是fprintf(),他的可选安全版本是fprintf_s(),其工作方式与fprintf()类似


fprintf_s()

原型:int fprintf_s(FILE * restrict pfile,const char * restrict format,...)

参数:第一个变元是指定输出流。第二个变元是指定的格式字符串。后面就是格式字符串对应的变量。

返回值:正常是返回写入的字符数,否则就返回一个负整数。


格式化文件输入


fscanf_s()

原型:int fscanf_s(FILE * restrict pfile,const char * restrict format,...)

参数:第一个变元指定输入流,第二个参数指定格式字符串,后面就是格式字符串对应的变量地址。

返回值:正常返回读取的值得个数,否则如果发生错误或者到达文件尾,就返回EOF


freopen_s()函数

freopen_s()函数是freopen()函数的可选安全版本,它常用于把标准流指针重新赋予一个文件。

原型:errno_t freopen_s(FILE * restrict * restrict pNew,const char * restrict filename,const char *restrict mode,FILE *restrict stream)

参数:第一个参数是新的流指针地址,第二个参数是文件名,第三个参数是打开操作方式,第四个参数是已经有的流指针

返回值:正常返回0,否则返回非0整数


filename是NULL时,该函数将尝试把第四个变元指定的流stream的模式改为mode。

filename不是NULL时,函数首先尝试关闭stream指向的文件,接着打开文件,把传递为第四个变元的已有流stream与文件关联起来。操作成功时,流指针存储在pNew中。失败使,pNew就设置为NULL


二进制文件的输入输出

二进制模式的优点是没有数据转换,也没有精度损失,还有就是速度比文本模式快。


以二进制模式打开文件

要指定二进制模式,只需要在基本打开模式说明符后附加b


写入二进制文件


fwrite()

原型:size_t fwrite(const void * restrict pdata,size_t size,size_t nitems,FILE * restrict pfile)

参数:第一个参数是要写入的数组的地址。参数类型是void*,表示任何类型的数组都可以传递为该函数的参数。第二个参数是数组的元素的字节数。第三个参数是数组元素的个数,第四个参数是文件流的指针。

返回值:正常返回数据项个数,否则返回小于nitems的个数。


读取二进制文件


fread()

原型:size_t fread(void *restrict pdata,size_t size,size_t nitems,FILE *restrict pfile)

参数:和fwrite()相同。

返回值:返回读取的项数


在文件中移动


找出当前位置


ftell()

原型:long ftell(FILE * pfile)

这个函数将一个文件指针作为变元,返回一个long整数值,指定文件中的当前位置。


fgetpos()

原型:int fgetpos(FILE * restrict pfile,fpos_t * restrict position)

参数:第一个是文件指针,第二个是定义在<stdio.h>中的fpos_t指针。fpos_t是能记录文件中的每个位置的数组类型。

返回值:正常会在position中存储当前位置和文件状态信息,并返回0,否则返回非0整数。


在文件中设定位置


fseek()

原型:int fseek(FILE *pfile,long offset,int origin)

参数:第一个参数是要重新定位的文件指针。第二和第三个参数定义文件中要到达的位置。第二个参数是距离第三个参数指定的参考点的位移。参考点可以是以下3中情况:SEEK_SET指定了文件的开头,SEEK_CUR指定了文件的当前位置,SEEK_END指定了文件的末尾。二进制文件不支持SEEK_END。都在<stdio.h>中定义。

对于文本文件,第二个参数必须是ftell()返回的值。第三个参数对于文本文件必须是SEEK_SET。因此,对于文本文件模式,fseek()函数的所有操作都以文件的开头作为参考点。

对于二进制文件,offset参数是一个相对的字节数。因此,参考点指定为SEEK_CUR时,可以个offset提供整数或负数。


fsetpos()

原型: int fsetpos(FILE *pfile,const fpos_t *position)

参数:第一个参数打开的文件的指针,第二个参数是fpos_t类型的指针,它的值是调用fgetpos()得到的地址。

返回值:正常返回0,否则返回非0整数。


这个函数要使用fgetpos()返回的值,所以只能用它得到之前文件中的某个位置,而fseek()函数允许到达任何位置。




1 0