【C_Language】---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_Language】---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,可移植的可执行的文件,常见 ...
随机推荐
- Python--day40--threading模块的几个方法
import time import threading #threading.get_ident() 查看当前进程号 def wahaha(n): time.sleep(0.5) print(n,t ...
- Python--day40--threading模块
import time from threading import Thread class MyThread(Thread): def __init__(self,arg): super().__i ...
- HDU 2871"Memory Control"(线段树区间和并+set.lower_bound)
传送门 •题意 有 n 个内存单元(编号从1开始): 给出 4 种操作: (1)Reset :表示把所有的内存清空,然后输出 "Reset Now". (2)New x :表示申请 ...
- Codeforces Round #564 (Div. 2)
传送门 参考资料 [1]: the Chinese Editoria A. Nauuo and Votes •题意 x个人投赞同票,y人投反对票,z人不确定: 这 z 个人由你来决定是投赞同票还是反对 ...
- 【踩坑记录】vue单个组件内<style lang="stylus" type="text/stylus" scoped>部分渲染失效
vue组件化应用,近期写的单个组件里有一个的渲染部分样式渲染不上去 因为同结构的其他组件均没有问题,所以排除是.vue文件结构的问题,应该是<style>内部的问题 <style l ...
- js快速替换json里的key值
需求是将b根据a的值替换对象中的key值 let a = ["code","name","date","font"]; ...
- POJ 1511 Invitation Cards(逆向思维 SPFA)
Description In the age of television, not many people attend theater performances. Antique Comedians ...
- HDU 6623 Minimal Power of Prime(数学)
传送门 •题意 给你一个大于 1 的正整数 n: 它可以分解成不同的质因子的幂的乘积的形式,问这些质因子的幂中,最小的幂是多少. •题解 把[1,10000]内的素数筛出来,然后对于每个素$P$数遍历 ...
- 浅谈Java中接口与抽象类的异同
浅谈Java中接口与抽象类的异同 抽象类和接口这两个概念困扰了我许久,在我看来,接口与抽象类真的十分相似.期间也曾找过许许多多的资料,参考了各路大神的见解,也只能是简简单单地在语法上懂得两者的区别.硬 ...
- linux dubbo-admin-2.6.0 环境搭建
1.去maven官网下载apache-maven-3.6.2-bin.tar.gz安装包 2.上传至linux服务器中 3.解压maven安装包 tar -zxvf apache-maven-3.6. ...