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

  又看了一遍文件的知识点了,断断续续已经看了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_Language】---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. java StringBuffer 与 StringBuilder

    String是不可变类,一旦String对象被创建,包含在对象中的字符序列是不可变的,直到对象被销毁: StringBuffer 与 StringBuilder对象则是可变的! 举例说明这两个的好处: ...

  2. SVN提示update更新成功,但是本地文件却没有更新

    问题描述:将仓库的最新版本代码check out到本地后,然后最某个文件做了修改,保存后想通过svn的update来重新得到最新的版本,发现失效. 原因:经过多方查找原因,主要看了以下两篇文档 htt ...

  3. 不幸的是,我试图在Eclipse中安装Maven 1.5,但出现了以下错误:

    Cannot complete the install because one or more required items could not be found. Software being in ...

  4. Roslyn 使用 Target 替换占位符方式生成 nuget 打包

    本文告诉大家如何编写在编译过程修改打包文件 在项目文件的相同文件夹可以放一个 nuspec 用来告诉 VisualStudio 如何打包 现在尝试创建一个项目 NearjerbetearDeeyito ...

  5. 数据预处理以及探索性分析(EDA)

    1.根据某个列进行groupby,判断是否存在重复列. # Count the unique variables (if we got different weight values, # for e ...

  6. CString::CompareNoCase与CString::Compare的区别

    转载:https://blog.csdn.net/lingdxuyan/article/details/4362116 函数原型:int CompareNoCase( LPCTSTR lpsz ) c ...

  7. Visio常规图表

    包含的就是一些形状模块 比如框图就包含了“方块”以及“具有凸起效果的块”两个形状模版 打开visio 新建的时候选择常规类别 具有透视效果的框图 下面是基本操作: 这是自动调整大小的框 不能调整大小 ...

  8. 基于python的二分搜索和例题

    二分搜索 二分概念 二分搜索是一种在有序数组中查找某一特定元素的搜索算法. 搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束: 如果某一特定元素大于或者小于中间元素,则在数 ...

  9. Spring||Mails

    JMail可以解决Java发送邮件,通过Jmail的核心javax.mail.jar实现,通过Jmail发送邮件需要经过以下步骤 1.创建解析邮件内容:Message类,通过javax.mail.in ...

  10. 洛谷$P$2468 粟粟的书架 $[SDOI2010]$ 主席树

    正解:主席树 解题报告: 传送门! 题目大意是说,给定一个矩形,然后每次会给一个,这个大矩形中的一个小矩形,询问从小矩形中最少选多少个数字能满足它们之和大于等于给定数字$x$ 看起来很神的样子,完全不 ...