【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()
在文本文件中读写字符串
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()函数允许到达任何位置。
- 【C】C语言处理文件读写
- c语言读写文件
- C语言读写文件
- C语言读写文件
- C语言文件读写
- C语言读写文件
- C语言文件读写
- C语言文件读写
- C语言读写文件
- C语言文件读写
- C语言读写文件
- C语言读写文件
- C语言读写文件
- C语言文件读写
- C语言读写文件
- C语言读写文件
- C语言 读写文件
- c语言读写文件
- matlab实现图片的平移操作
- 第四周 求长方形周长和面积
- 进程和线程
- macbook 换固态硬盘 光驱位机械硬盘自动加载卸载
- VMware 11.0 简体中文版|附永久密钥
- 【C】C语言处理文件读写
- angularJS
- JSTL标签库学习笔记 二、核心标签库的表达式控制标签
- 【源码解读】Retrofit网络请求过程源码解析
- JSTL标签库学习笔记 三、核心标签库的流程控制标签
- 我谈微信应用号
- hadoop 2.6.4伪分布式启动
- 1.width是核心内部元素,margin,padding,border值不属于width 2.absolute 两个绝对定位的元素如果是同一父元素会发生重叠,而不是与float一样会正常排布
- 权限系统