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)
三个参数:缓冲区(文件缓冲区)、移动的几个位置、基于哪个位置
- Poedu_C语言_lesson26_20161008_文件处理函数
- Poedu_C语言_lesson24_20161006_字符串处理函数_fgets与gets
- Poedu_C语言_Lesson25_20161007_字符串处理函数(2)
- Poedu_C语言_Lesson21_20160924_函数1
- Poedu_C语言_lesson22_20160927_函数2
- Poedu_C语言_lesson23_20160928_函数3
- Poedu_C语言_lesson11_20160911_char类型
- Poedu_C语言_lesson12_20160911_小数
- Poedu_C语言_20160912_复习
- Poedu_C语言_lesson13_20160912_字符串
- Poedu_C语言_lesson15_20160914_printf详解
- Poedu_C语言_lesson14_20160913_常量
- Poedu_C语言_lesson16_20160916_scanf详解
- Poedu_C语言_lesson19_20160920_循环
- Poedu_C语言_lesson09_20160908_编程概述
- Poedu_C语言_lesson10_20160909_整数类型
- Poedu_C语言_Lesson20_20160923_分支语句
- Poedu_C语言提升_Lesson01_20161108_数据类型
- node.js的事件驱动
- 第12周项目5 迷宫问题
- 手动配置windows 7系统的ipv6地址方法
- java文件读写操作指定编码格式[转]
- drawable下面的xml如何调用mipmap下的图片资源?
- Poedu_C语言_lesson26_20161008_文件处理函数
- Mysql 配置参数
- 第十三周项目1(1)普里姆算法的验证
- hadoop学习2--hdfs详解
- mysql 数据库优化案例
- gcc编译标志-fPIC
- iOS开发之Block常见用法
- Android资源知识(一)之Resources概览
- 第十三周--prim算法的验证