---恢复内容开始---

  又看了一遍文件的知识点了,断断续续已经看了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文件学习的更多相关文章

  1. PHP操作XML文件学习笔记

    原文:PHP操作XML文件学习笔记 XML文件属于标签语言,可以通过自定义标签存储数据,其主要作用也是作为存储数据. 对于XML的操作包括遍历,生成,修改,删除等其他类似的操作.PHP对于XML的操作 ...

  2. Python文件学习

    Python文件学习 文章 Python文件学习 open函数 基本的用法模式:file_object=open('',access_mode='r',buffering=-1) 其中access_m ...

  3. python第三方库——xlrd和xlwt操作Excel文件学习

    python第三方库——xlrd和xlwt操作Excel文件学习 1安装: C:\Users\Lenovo>pip install xlwtCollecting xlwt  Downloadin ...

  4. Makefile文件学习总结

    Makefile文件相当于是一种脚本编程语言,目的是实现自动化编译.编写makefile文件的过程中可以使用变量.控制结构和函数等一般编程语言的特性. Makefile文件的组成内容.makefile ...

  5. PE文件学习系列笔记四-C++实现PE文件的分析

    合肥程序员群:49313181.    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q  Q:408365330     E-Mail:egojit@qq.com 综述: 首 ...

  6. PE文件学习系列三-PE头详解

    合肥程序员群:49313181.    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q  Q:408365330     E-Mail:egojit@qq.com 最近比较忙 ...

  7. PE文件学习系列一为什么是PE

    合肥程序员群:49313181.    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入)Q  Q:408365330     E-Mail:egojit@qq.com PE概述: ...

  8. Android Studio 学习 - AndroidManifest.xml文件学习

    首先,今天发现了一个很牛逼的教程网站:慕课网(http://www.imooc.com/).有很多大牛发布的教学视频.值得收藏.学习. 今天主要参照陈启超老大的视频,学习了多个Activity之间的切 ...

  9. 【学习】Windows PE文件学习(一:导出表)

    今天做了一个读取PE文件导出表的小程序,用来学习. 参考了<Windows PE权威指南>一书. 首先, PE文件的全称是Portable Executable,可移植的可执行的文件,常见 ...

随机推荐

  1. jquery 简单弹出层(转)

    预定义html代码:没有 所有代码通过js生成和移除. 预定义css /* 基本弹出层样式 */ .my-popup-overlay { width:100%; height:auto; /* wid ...

  2. ANGULAR 2 FOR REACT DEVELOPERS

    Now that Angular 2 is in beta, the time has come for us to drop everything and learn something new, ...

  3. location.hash 详解

    前年9月twitter改版. 一个显著变化,就是URL加入了"#!"符号.比如,改版前的用户主页网址为 http://twitter.com/username 改版后,就变成了 h ...

  4. http://blog.csdn.net/zhang_xinxiu/article/details/38655311

    一.Activiti下载及简介 1.1.Activiti下载 官网下载地址:http://activiti.org/download.html        Note:下载时不一定要使用最新版本的,最 ...

  5. C#中的WebBrowser控件加载ActiveX插件

    C#中WebBrowser控件,将项目输入更改为x86输出,在页面打开时即可自动加载ActiveX控件

  6. ruby 方法重载

    class MyClass def sayHello return "hello from MyClass" end def sayGoodbye return "Goo ...

  7. 【原创翻译】Reducing Branch Delay to Zero in Pipelined Processors

    在流水线处理器中减少分支延迟到零 Antonio M. Gonzalez and Jose M. Llaberia 摘要 一种减少流水处理器中分支延迟到零的机制将在本文被描述以及评估.这种机制基于多重 ...

  8. Android开发UI之控件-Android-PullToRefresh

    下拉刷新,使用的是Android-PullToRefresh,Github--https://github.com/chrisbanes/Android-PullToRefresh PullToRef ...

  9. 用U盘安装系统

    下述的前提就是:如果你想要装win7,win8系统的话,你需要准备一个大于等于4G的U盘,但是如果你想装XP,Ubuntu等小系统就可以只要1G的U盘就行了,温馨提示,记得将U盘里的重要东西移走,因为 ...

  10. BrandZ:2016年全球最具价值品牌百强榜(完整报告)

    https://wppbaz.com/admin/uploads/files/BZ_Global_2016_Report.pdf Millward Brown编制的BrandZ最新排行榜(2016 B ...