【三支火把】---C文件学习
---恢复内容开始---
又看了一遍文件的知识点了,断断续续已经看了2-3遍,也就这次花了点时间做了一下总结,以后我想都不会再去翻书了,哈哈。
1、 基于缓冲区的文件操作
2、 打开关闭文件
3、 单个字符读写
4、 文件指针定位
5、 字符串读写
6、 块读块写
7、 格式化读写
一、 读写操作都要经过一个缓冲区, 满足一定条件后再进行读入
和写入。
标准的输入以及输出, 内部为基于缓冲区的文件操作。
标准输入: stdin
标准输出: stdout
标准错误: stderr
清理缓冲区: fflush();
二、 打开关闭文件
c语言当中, 用FILE这个结构体, 描述打开的文件的详细信息。 FILE定义stdio.h文件里面。
1、 打开函数
原型: FILE *fopen(const char *path, const char *mode); //第一个参数为路径 第二个为打开的方式
绝对路径 or 相对路径:相对于顶层目录的路径 当前工程下的路径
工程下面有一个1.txt: "d://_ccccccc/1.txt"--结对路径 "1.txt" --相对路径
参数2:打开方式--读,写
返回值: 打开成功后返回操作这个文件的指针。 失败返回NULL
程序代码如下:
FILE *fp_open(void)
{
static FILE *fp;
fp = fopen(FILE_NAME,"w+"); //打开或创建一个txt文件。
if(fp != NULL)
printf("File opened succed!");
else
printf("File opened failed!");
return fp;
}
int main(void)
{
FILE *fp = fp_open(); //定义一个文件指针,指向一个采用“w+”方式打开的文件
return ;
}
在此有必要掌握mode方式表:详情见图
打开方式 |
含义 |
“r/rb” (只读) |
为输入打开一个文本/二进制文件 |
“w/wb” (只写) |
为输出打开或建立一个文本二进制文件 |
“a/ab” (追加) |
向文本/二进制文件尾追加数据 |
“r+/rb+” (读写) |
为读/写打开一个文本/二进制文件 |
“w+/wb+” (读写) |
为读/写建立一个文本/二进制文件 |
“a+/ab+” (读写) |
为读/写打开或建立一个文本/二进制文件 |
注意:
用”r”方式打开的文件只能进行读操作,而且该文件必须存在,不能用”r”打开一个不存在的文件
用”w”打开的文件只能进行写操作,如果原来不存在,则打开时新创建一个该文件名字的文件,如果打开原来存在的文件,则从该文件的起始位置重新继续写入,原来的内容会被覆盖掉。
用”a”打开的文件也只能进行写操作,且文件必须存在,此时文件指针移动到文件的末尾,从末尾继续添加新的数据。
“b“表示打开的是一个二进制文件,r+或w+表示可以进行读写操作。
2、 关闭函数
fclose(FILE *fp);//关闭fp指向的文件
三、 单个字符读写
写: fputc 原型: int fputc(int c, FILE *stream); //正确返回ch,错误返回EOF(-1)
读: fgetc 原型: int fgetc(FILE *stream); //正确返回读到的ch,错误返回EOF(-1)
测试函数如下:
int main(void)
{
char ch;
FILE *fp = fp_open(); //fp_open()函数见上面
ch = getchar(); //从控制台输入一个字符
fputc(ch,fp); //将字符写入文件
rewind(fp); //将文件指针重置在文件头部
printf("%c",fgetc(fp)) ; //打印出读到的字符
return ;
}
注意:
putc(ch,fp)与fputc(ch,fp)效果一致,但是putc可以作为宏定义,速度更快
getc(fp)与fgetc(fp)效果一致,但是getc可以作为宏替换,速度更快。
putchar(c) 则是fputc(c,stdout);
getchar()则是fgetc(stdin);
在此在介绍一下getc和getchar()以及putc和putchar()这两个函数的区别以及联系
输入原型: getc: int __cdecl getc(FILE *_File); 向某个文件输入一个字符
getchar: int __cdecl getchar(void); 这个是getc的一个变形,,指定文件的形参为stdin;
输出原型: putc : int __cdecl putc(int _Ch,FILE *_File); 从某个某个文件输出
putchar: int __cdecl putchar(int _Ch);
四、 文件指针定位
1、 rewind(FILE *fp); //将读写指针定位到文件开始位置。
rewind函数具体应用参考上面函数,
2、 fseek(FILE *fp,long offset,int whence);//将fp指向的文件的读写 //参数2:表示便宜字节数 参数3:表示参考位置
/*标准库下,含有这三个宏定义:SEEK_SET:起始位置 SEEK_END:末尾 SEEK_CUR:当前位置*/
rewind()其实是fsee()的一个特殊函数
rewind(fp) = fseek(fp,0,SEEK_SET); 这两者是相等的。
3.int feof(FILE *fp); //判断文件读写指针是否到达末尾, 到达返回1, 没有返回0
同理,该函数因该是也和fseek()有异曲同工之妙。
五、 字符串读写
写: fputs
原型: int fputs(const char *s,FILE *stream); //返回值,返回输入字符串的最后的‘\0’,如果输入过程被打断,则会返回最后一次输入的字符
读: fgets
原型: char *fgets(char *s, int n, FILE *stream); //返回值,成功返回接收字符串的首地址,失败的话,返回NULL
程序如下:
int main(void)
{
char s[];
FILE *fp = fp_open(); //定义一个文件指针,指向一个采用“w+”方式打开的文件
gets(s); //输入一个字符串
fputs(s,fp); //将字符串的内容输入到我文件中
rewind(fp);
printf("%s\n",fgets(s,,fp)); //从文件中读取五个字节的字符串(包括最后的‘\0’,所以实际只能取出4个)
return ;
}
这里需要的注意的是,读取数来的是一个n个字节的字符串,包含最后'\0',所以在测试的时候,只能输出4个字符,最后一个字节是'\0'。
六、 块读块写
写: fwrite
原型:size_t fread(void *buffer,size_t size, size_t count, FILE *fp);
读: fread
原型:size_t fwrite(void *buffer,size_t size, size_t count, FILE *fp);
功能:
fread:从fp所指向的文件中读取count个块,每个块的长度为size个字节,存放到以buffer为首地址的内存中(buffer必须是已经开辟空间的)、
fwrite:从以buffer为首地址的内存中读取count个快,每个 快的的长度为size个字节,写入到fp所指向的文件中。
返回值:1 成功 0 出错或者文件尾部
七、 格式化读写
fscanf 原型:int fscanf(FILE *fp,const char *format[,address,?])
fprintf 原型:int fprintf(FILE *fp,const char *format[,argument,?])
其实这俩函数可以类比printf()将数据打印到控制台上和scanf()从控制台输入数据。
fscanf()函数就是?????????????????
fprintf()函数就是将数据以某种格式输入到文件中。 //有个问题 ,输入十进制int型数字,为何按照字符串输出会能够输出???
八、其他一些函数的说明
1、 ftell()函数
原型:long ftell(FILE *fp)
功能:返回位置指针当前位置(用相对文件开头的位移量表示)
返回值:成功,返回当前位置指针位置,失败返回-1L;
2、ferror()函数
原型:int ferror(FILE *fp)
功能:测试文件是否出现错误
返回值:未出错, 0;出错,非 0
说明:每次调用文件输入输出函数,均产生一个新的 ferror 函数值,所以应及时测试fopen 打开文件时, ferror 函数初值自动置为 0
3. remove() 函数
函数原型: int remove(char* path)
功能:删除指定路径的文件
返回值:成功删除, 0;否则, -1
4. clearerr() 函数
函数原型: void clearerr(FILE *fp)
功能:使文件错误标志置为 0
返回值:无
说明:出错后,错误标志一直保留,直到对同一文件调 clearerr(fp)或 rewind 或任何其它一个输入输出函数
5.文件操作步骤
1. 打开文件
FILE* fp = fopen("路径:文件名", "打开方式"); //r/w/rb/wb/a/r+/w+ 文本文件和二进制文件
2. 文件读写
1>. 读写单个字符: fputc() fgetc()
2>. 读写字符串: fputs() fgets()
3>. 读写结构体等(读写块) fwrite() fread() //二进制
4>. 格式化读写 fprintf() fscanf()
3. 关闭文件
fclose(fp);
//文件函数总结
1、 fputc、 fgetc、 feof、 rewind
2、 rewind、 fseek
3、 fputs、 fgets
4、 fread、 fwrite
5、 fscanf、 fprintf
6、 int ftell(FILE *fp)// fseek(fp,0,SEEK_END),ftell(fp);//
---恢复内容结束---
【三支火把】---C文件学习的更多相关文章
- PHP操作XML文件学习笔记
原文:PHP操作XML文件学习笔记 XML文件属于标签语言,可以通过自定义标签存储数据,其主要作用也是作为存储数据. 对于XML的操作包括遍历,生成,修改,删除等其他类似的操作.PHP对于XML的操作 ...
- Python文件学习
Python文件学习 文章 Python文件学习 open函数 基本的用法模式:file_object=open('',access_mode='r',buffering=-1) 其中access_m ...
- python第三方库——xlrd和xlwt操作Excel文件学习
python第三方库——xlrd和xlwt操作Excel文件学习 1安装: C:\Users\Lenovo>pip install xlwtCollecting xlwt Downloadin ...
- Makefile文件学习总结
Makefile文件相当于是一种脚本编程语言,目的是实现自动化编译.编写makefile文件的过程中可以使用变量.控制结构和函数等一般编程语言的特性. Makefile文件的组成内容.makefile ...
- PE文件学习系列笔记四-C++实现PE文件的分析
合肥程序员群:49313181. 合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q Q:408365330 E-Mail:egojit@qq.com 综述: 首 ...
- PE文件学习系列三-PE头详解
合肥程序员群:49313181. 合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q Q:408365330 E-Mail:egojit@qq.com 最近比较忙 ...
- PE文件学习系列一为什么是PE
合肥程序员群:49313181. 合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入)Q Q:408365330 E-Mail:egojit@qq.com PE概述: ...
- Android Studio 学习 - AndroidManifest.xml文件学习
首先,今天发现了一个很牛逼的教程网站:慕课网(http://www.imooc.com/).有很多大牛发布的教学视频.值得收藏.学习. 今天主要参照陈启超老大的视频,学习了多个Activity之间的切 ...
- 【学习】Windows PE文件学习(一:导出表)
今天做了一个读取PE文件导出表的小程序,用来学习. 参考了<Windows PE权威指南>一书. 首先, PE文件的全称是Portable Executable,可移植的可执行的文件,常见 ...
随机推荐
- 判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
提醒大家,Object.prototype.toString().call(param)返回的[object class]中class首字母是大写,像JSON这种甚至都是大写,所以,大家判断的时候可以 ...
- c++ 类的对象与指针
这里首先我们需区分一下指针数组和数组指针. 指针数组:int *p[4];它最终是个数组,只是这个数组存储的是4个指向int类型的指针. 数组指针:int (*P)[4];它最终是个指针,表示一个指向 ...
- 转--Server “**” has shut down the connection prematurely一例分析
近几天在性能测试过程中,发现loadrunner Controller经常报 Server “**” has shut down the connection prematurely .概率很高,现象 ...
- Tomcat 6.0下配置HTTPS
最近项目需要使用到https,所以回顾整理了一下,其实在tomcat的文档中已经有了详细描述,我们启动Tomcat后,可以在docs文档中找到 地址如下:http://localhost:8080/d ...
- logstash gsub替换
{ "message" => "192.168.11.186,192.168.11.187\t48391,3306\tDec 7, 2016 13:26:25.13 ...
- 关于HSL和HSV颜色空间的详细论述
目前在计算机视觉领域存在着较多类型的颜色空间(color space).HSL和HSV是两种最常见的圆柱坐标表示的颜色模型,它重新影射了RGB模型,从而能够视觉上比RGB模型更具有视觉直观性. HSV ...
- 升级yosemite后java出错的解决
昨天升级mac os到yosemite后,因为是系统整体升级,有一些在设置会丢失,这是后话,先说说我在执行一个需要java参与的程序的时候得到如下错误: Error: JAVA_HOME is not ...
- NOI 2014 感想
NOI2014结束了,我卡线登上了领奖台... 这是我第一次NOI,我觉得我收获了很多东西: 1.考前心态不重要,重要的是实力 真正考试的时候是顾不得想其他事情的 2.测试数据是人出的!不是随机的!不 ...
- Mac 上Dock中添加“最近打开过的项目”(Recent Applications)
有一个特别有用的Stack,“最近打开过的项目”,建立方法如下: 1. 打开Terminal,输入以下命令 defaults write com.apple.dock persistent-other ...
- C#创建https请求并使用pfx证书
常规情况下创建Web请求,并获取请求数据的代码如下: WebRequest req = WebRequest.Create(url); req.Timeout = 15000; WebResponse ...