Poedu_C语言_lesson26_20161008_文件处理函数

来源:互联网 发布:丰胸 知乎 编辑:程序博客网 时间:2024/06/05 13:30

1.文件存储的本质:都是以二进制存储的


2.对于文件的处理方式:

1)二进制

2)文本(最终还是二进制)



3.fopen:

=>f前缀,表示处理对象是文件(命名规范)

=>功能:打开一个文件

=>参数:文件路径,打开方式

=>打开方式:

r:只读,不会新建,当文件不存在时,返回空指针

w:只写,如果文件存在,原文件数据会全部清空!!当前不存在,就会新建一个文件

a:追加模式,在文件末尾追加,不会清空原来的内容,如果不存在该文件,会新建

=>以上三种为最基础模式,可在其后加后缀:

+:更新模式,变为可读可写,但是原来的特性不会改变(r不会新建,w还是会清空内容)

b:二进制方式打开,操作都是基于二进制,压缩等会用到(将结构体写入文件也会用到)

x:独占方式打开,打开之后,其它程序不能够打开该文件(系统会报错)

=>返回值:打开成功,返回FILE型指针(指向当前文件的缓冲区)。打开失败,返回NULL

=>操作的是缓冲区,而不是直接对文件操作

=>直接操作文件的速度是最慢的,先将文件读取到缓冲区(内存)当中,再进行文件处理时速度会变得更加快捷


4.fopen只能将当前文件读入缓冲区中,这个功能是完全不够用的

=>操作缓冲区中的数据:<stdio.h>

=>读取:getc

=>需要传递的参数:FILE型指针

=>标准输入、标准输出(标准错误流)都是FILE对象

=>写入:putc:将指定内容传递到指定缓冲区

=>需要传递的参数:需要传递的内容,FILE型指针

=>文件结束符:EOF:可以判断文件是否读取完毕

看一段代码:


代码中的"demo.txt":相对路径

=>所在位置:解决方案->在文件资源管理器中打开文件夹

=>fp返回NULL,有可能是文件位置放错了。VS调试时,会在debug同级的文件夹中(源文件夹)查找"demo.txt"(只有在运行exe时才会在debug目录下),而不是在debug文件夹下,如果我们把demo.txt放在debug下,会使编译器认为没有找到,返回空指针,再进行getc时就会发生异常

=>以exe所在的文件夹作为参照物,如果需要上级文件夹,可用".\\"来表示

=>"c:\\...\\..":绝对路径:只能确保在与当前本机上的环境一样时(一个字母都不能差)才能执行,所以一般使用相对路径

编译本段代码时会有一个报错:VS认为fopen是非安全函数

=>在VS中,有一个fopen_s的函数,但是我们不用,因为我们的程序要能在其它平台运行

=>取消报警



put(ch,fp)会将缓冲区的内容在程序正常关闭时写入到fp所关联的文件中(txt)。

但是,如果程序异常关闭呢??

那么我们的操作并不会正常更新到指定文件中(因为我们不是直接对文件进行操作的)

为了保证能够正常更新:用fclose(fp);

而且,在使用fopen时,因为返回值可能是NULL,如果在NULL的情况下,依旧进行关闭的操作,那么程序在运行到这时会报错,因为编译器找不到需要关闭的文件指针。所以在使用fopen的时候,不要忘记,加一个判断,下面的操作都是基于文件成功打开的前提下的

如果把输出内容的循环注释掉后,再使用r+进行输入,再打开txt会发现,内容被覆盖了,为什么?

=>有一个游标,对内容进行操作时,游标会跟随一起动,如果没有输出内容这个操作的时候,游标就会停留在文件的开头,再进行操作的时候,就会造成内容的覆盖

=>使用a+方式打开文件:会默认游标在文件末尾,读取的时候从开头开始读取,没问题,输入的时候是从文件末尾开始,是一种比较靠谱的方法

=>操作游标的方式


游标:执行操作时,游标都会移动(游动的标记)

=>fseek:设置游标位置,long型,只能存储2亿多的位置

=>fsetpos(大数据会碰到)

 常见游标位置:

1)SEEK_SET:文件最开头:r+模式时,游标一开始在这个位置

2)SEEK_CUR:当前游标所在的位置

3)SEEK_END:a+模式下,游标一开始所在的位置

ftell:获取游标位置:long型:只能存储2亿多个游标

=>fgetpos(大数据会碰到)

5.文件的读取与写入:

读取:

getc:从文件中读取一个字符

fscanf:格式化读取

fgets:整行读取(当遇到'\n'时停止)

写入:

putc:向文件中写入一个字符

fprintf:格式化输出

fputs:整行输出(向文件中写入一个字符串)

=>fgets与fputs比较常用

long last=ftell(fp);//获取游标位置

 =>发现last和count统计的数值不一样

=>在vs下,换行符是以\r\n来进行读取的,ftell读取一个换行符是占用2个字符的大小,所以两者的值就不同了

=>根据系统不同而不同,在liunx下,换行只占1个字符

fseek(fp,0,SEEK_SET)

三个参数:缓冲区(文件缓冲区)、移动的几个位置、基于哪个位置






0 0
原创粉丝点击