seo优化网站网页教学,公司网站的建站要点,南通网站推广怎么收费,深圳罗湖网站制作公司系列文章目录 速通C语言系列 速通C语言第一站 一篇博客带你初识C语言 http://t.csdn.cn/N57xl 速通C语言第二站 一篇博客带你搞定分支循环 http://t.csdn.cn/Uwn7W 速通C语言第三站 一篇博客带你搞定函数 http://t.csdn.cn/bfrUM 速通C语言第四站 一篇博客带…系列文章目录 速通C语言系列 速通C语言第一站 一篇博客带你初识C语言 http://t.csdn.cn/N57xl 速通C语言第二站 一篇博客带你搞定分支循环 http://t.csdn.cn/Uwn7W 速通C语言第三站 一篇博客带你搞定函数 http://t.csdn.cn/bfrUM 速通C语言第四站 一篇博客带你学会数组 http://t.csdn.cn/Ol3lz 速通C语言第五站 一篇博客带你详解操作符 http://t.csdn.cn/OOUBr 速通C语言第六站 一篇博客带你掌握指针初阶 http://t.csdn.cn/7ykR0 速通C语言第七站 一篇博客带你掌握数据的存储 http://t.csdn.cn/qkerU 速通C语言第八站 一篇博客带你掌握指针进阶 http://t.csdn.cn/m95FK 速通C语言第八.五站 指针进阶题目练习 http://t.csdn.cn/wWC2x 速通C语言第九站 字符相关函数及内存函数 http://t.csdn.cn/YyBBM 速通C语言第十站 自定义类型 http://t.csdn.cn/jsGJ7 速通C语言第十一站 动态内存开辟 http://t.csdnimg.cn/necjp 感谢佬们支持首先祝大家元旦快乐 文章目录
系列文章目录前言1、为什么使用文件2、什么是文件 文件名3、文件的打开和关闭4、文件的顺序读写 流 一次读一个 一次读一行 格式化输入输出函数 二进制输入输出函数 综合对比5、文件的随机读写6、文本文件和二进制文件7、文件读取结束的判定8、文件缓冲区总结 前言 在学习之前我家首先要知道文件/文件系统是一个很重要的东西而且研究文件只停留在语言层面是非常片面的。等我们学到操作系统后才会对此有一个更深的理解. 1、为什么使用文件 比如说我们写一个通讯录运行之后进行增删查改但是退出程序后我们的数据就没了 要想有信息拷贝就要把数据写到文件中。 2、什么是文件 文件分为两种一种为数据文件另一种为程序文件内存文件 程序文件分为3种 1、我们写的.c文件 2、编译过程中产生的临时文件 .i ,.s .o 3、最后生成的可执行程序 .exe 而数据文件简单来说就是我们能从这个文件中读点数据也能将程序中的文件写到文件中 文件名 一个文件需要一个唯一的文件标识符在我们看来是文件名(但是在操作系统看来不是)
文件名由三部分构成 文件路径文件名后缀注在Linux系统中文件后缀没用 例
C:\code\test.txt 而文件的路径分为两种 一种叫绝对路径表示从根目录一直到你当前文件的路径 例如/c/Users/86138/tDesktop/test.c 还有一种叫相对路径可以表示当前路径或上级路径的文件 比如test.c ../test.c 3、文件的打开和关闭 每一个被打开的文件都在内存中用一个结构体维护用于存放文件的部分信息如文件存放的位置文件的状态信息等这个结构体被typedef为FILE 所以我们要想对这个文件做什么就要用文件指针FILE*调用 关闭一个文件我们用fclose函数 如果关闭成功返回0失败返回EOF 打开一个文件我们用fopen函数 其中第一个参数为文件的名字第二个参数为打开文件的方式有6种选项选择我们重点研究前三个 如果打开成功返回一个文件指针失败就返回NULL 我们写一波代码给大家看一下 我们先以 写 打开一个文件用“w选项 意为如果文件存在会先清空再打开如果不存在会创建出来 FILE* pf fopen(test.txt, w);if (pf NULL){printf(打开失败\n);}//写文件//关文件fclose(pf);pf NULL;
运行之后打开代码所在的目录 果然多了一个test.txt 写了之后我们在读一个文件
FILE* pf fopen(test.txt, r);if (pf NULL){perror(fopen\n);} 读和写不同如果没有该文件会直接报错使用perror函数 4、文件的顺序读写
流
我们先来补充一个流的概念流的概念很抽象我们在没学操作系统之前只能稍微理解一下 众所周知我们储存一个程序文件有很多硬件来选择比如屏幕屏幕显示文件的本质也是存储硬盘U盘网络 所以选择很多不同选择的读写方式肯定不同而在软件层面要考虑所有选择的读写方式显然太SB了所以我们抽象一个“流”的概念出来,其类型为FILE* 我们在写文件的时候向流中写剩下向右边的东西怎么写是操作系统的事他会以多态的方式实现一系列方法这些都是以后再学的啦 另外当C语言程序运行起来就默认打开了3个流 0 stdin (标准输入流) 对应得硬件是键盘 1 stdout(标准输出流) 对应得硬件是屏幕 2 stderr(标准输出错误流) 对应得硬件也是屏幕 一次读一个
我们用fputc/fgetc可以从指定流中输出/输入一个数据 我们尝试向标准输出stdout显示器输出3个字母
fputc(z, stdout);fputc(y, stdout);fputc(g, stdout); 再尝试从标准输入stdin中读几个字符 既然我们能从stdoutstdin里读写那么文件也可以
创建一个test.txt
FILE* pf fopen(test.txt, w);//写fputc(a, pf);fputc(b, pf);fputc(c, pf); 查看一下test.txt (成功)
再读
FILE* pf fopen(test.txt, r);int ret fgetc(pf);printf(%c\n, ret);第二次读 一次读一行
一次读写一个字符太慢了
由此我们提供fgets读一行fputs写一行 注意num代表读取的最大个数如果num100则实际读99个因为要预留一个\0的位置 因为无论如何这都是在语言的层面读写就要遵守语言的规则以\0结尾 另外如果某一行的大小1\0的大小num,那就只读这一行不读下一行 例
FILE* pf fopen(test.txt, w);fputs(abc\n, pf);fputs(qwe\n, pf);fclose(pf);pf NULL;
打开文件 读
FILE* pf fopen(test.txt, r);char arr[10] { 0 };fgets(arr, 4, pf);printf(%s\n, arr); 先读4个发现只读了第一行 fgets(arr, 5, pf);printf(%s\n, arr); 改成读5个他依然只读第一行 格式化输入输出函数
fprintf fscanf const char* format是我要输的格式就和我们学的printfscanf一样 例
struct S{char arr[10];int num;float sc;};struct S s { abcdef,10,5.5};FILE* pf fopen(test.txt, w);if (pf NULL){perror(fopen);}fprintf(pf, %s %d %f,s.arr,s.num,s.sc);二进制输入输出函数
fread 从流中读count个size大小的数据到buffer中 fwrite 把buffer中count个size大小的数据写入buffer中 例
struct S{char arr[10];int num;float sc;};struct S s { abcdef,10,5.5 };FILE* pf fopen(test.txt, wb);//二进制写wbif (pf NULL){perror(fopen\n);}fwrite(s, sizeof(struct S), 1, pf); 字符串从二进制写进去还是一样但是数字不行我们看不懂 我们看不懂但是fread可以 struct S s {0 };FILE* pf fopen(test.txt, rb);//二进制读rbfread(s, sizeof(struct S), 1, pf);printf(%s %d %f, s.arr, s.num, s.sc);读一下
struct S{char arr[10];int num;float sc;};struct S s { 0};FILE* pf fopen(test.txt, r);if (pf NULL){perror(fopen);}fscanf(pf, %s %d %f,s.arr,(s.num),(s.sc));//记得加printf(%s %d %f, s.arr, s.num, s.sc); 综合对比
我们再补充一个sscanf和sprintf 从一个字符串中读取一个格式化的数据其中format代表格式 再加上我们熟悉的scanf和fscanf scanf从标准输入stdin键盘输入格式化的语句 针对所有输出流的格式化输入语句其中输出流包括stdin和文件也就是说scanf是fscanf的子集 fscanf(0,const char* format...)//等价于scanf把一个字符串中转换一个格式化的数据其中format代表格式 printf,针对标准输出stdout(显示器) 的格式化输出语句 fprintf,针对所有输出流 的格式化输出语句同上标准输出流包括stdout和文件 fprintf(1, const char* format...)//等价于printf5、文件的随机读写 随机读写意为想读哪读哪 之前我们学的顺序读写只能从开头往下一个一个读有了随机读写我们可以从任意地方开始读。 第二个参数表示偏移量 第三个参数表示起始位置有三种选择 SEEK_CUR 当前文件指针的位置 SEEK_END 文件末此时偏移量只能为负即从后向前读但是其封装的系统调用lseek中为可正可负会对文件相应扩容并产生文件空洞等此处可以忽略 SEEK_SET 文件开始此时偏移量只能为正即从头开始读 我们写个代码来用一下这个函数
先将我们的test.txt中写上abcdef
FILE* pf fopen(test.txt, r);int ch fgetc(pf);printf(%c\n, ch);//ach fgetc(pf);printf(%c\n, ch);//bch fgetc(pf);printf(%c\n, ch);//c 显然再往下读就是d了现在我们又想读b了怎么办调整一下文件指针往前推两个
fseek(pf, -2, SEEK_CUR);ch fgetc(pf);printf(%c\n, ch); 又读到b了牛逼 与之补充的还有两个函数
ftell 可以返回我们当前文件的偏移量 例 我们当前读完了b要读c所以偏移量为2 rewind 让文件指针的位置又回到文件开始 例
printf(文件的偏移量为%d\n, ftell(pf));rewind(pf);printf(文件的偏移量为%d\n, ftell(pf)); 6、文本文件和二进制文件 根据数据得组织形式数据文件被称为文本文件/二进制文件 二进制文件数据在内存中以二进制形式储存如果不加转换得输出到外存就是二进制文件 文本文件如果要求在外存上以ASCII码的形式存储则需要在存储前转换以ASCII码的形式存储的文件就是文本文件。 对应到数据就是 字符一律ASCII码 数值型数据既可以ASCII码又可以二进制 例
给一个整数10000int以ASCII码存就是占5个字节但是以二进制形式就是4个字节 7、文件读取结束的判定
feof 注意在文件读取中绝不能用feof的返回值来判断文件是否结束而是应用于文件已经结束了是读取失败结束的还是遇到文件结尾结束的。 文件正常结束会返回一个非0的值 ferror 不为-1就是打开失败 所以到底该怎么判断文件结束
对于文本文件判断返回值是否未EOFend of file
对于二进制fread在读取时返回的是实际读取完整元素的个数如果发现读取到的完整元素的个数指定元素的个数这就是最后一次读取了但实际上在系统调用read的层面有很多情况都能导致读到的完整元素个数(ssize_t)指定元素个数此处我们不做考虑。 用上面的方法得知文件结束后我们再用feof函数
例
假设test.txt文件中有一份代码要求把test.txt文件拷贝一份生成test2.txt
test.txt int main()
{FILE* pfread fopen(test.txt, r);if (pfread NULL){perror(fopen\n);}//写文件FILE* pfwrite fopen(test2.txt, w);if (pfwrite NULL){//这次打开失败了说明第一次打开成功了所以得释放第一个fclose(pfread);pfread NULL;return 1;}//从pfread里读写到pfwrite里int ch 0;while ((ch fgetc(pfread)) ! EOF){fputc(ch, pfwrite);}//关文件fclose(pfread);pfread NULL;fclose(pfwrite);pfwrite NULL;
}
运行之后
test2果然也有了相同的代码 下来该判断文件如何结束的了
if (ferror(pfread))puts(I/O error when reading\n);else if (feof(pfread))puts(EOF reach successfully\n); 正常结束了 8、文件缓冲区
先给到大家一张图然后再举一个例子 先举个现实生活中的例子 比如你在北京你的朋友在济南你想给他寄一个东西所以你就跑到你们学校的快递站填好信息。 此时你的快递就被寄出去了吗没有为什么为什么不马上寄出去 如果说你刚走了快递被一辆车寄出去了又有一个人来了填的信息也是寄向济南然后再派一辆车寄吗这成本太高了肯定不能这么做 所以怎么办 快递站有一个专门放寄往济南的柜子柜子满了再寄也就是要等一波寄往济南的快递然后只派一辆车寄这成本就小很多了呀 对应于计算机我们再举一个例子 比如我写数据我想往硬盘上写但是这数据不是你能写的你得告诉操作系统给你写、 操作系统是很忙的你跟操作系统说哥们往磁盘写个数据操作系统停下手上的活给你写过一会儿你又说哥们往磁盘写个数据……那操作系统什么都不干刚给你写数据 那效率太低了。这个时候就要用的缓冲区了 你往磁盘写数据先往缓冲区上写缓冲区满了操作系统再一波往磁盘上写。 所以缓冲区是很有必要的 注意这波我们学的缓冲区是C语言给我们提供的也就是说是一个语言层的缓冲区 总结 做总结还是那句话这篇博客只能带大家对文件有一个浅显的认识在正式学了操作系统的基础IO和文件系统才能对这些有更深刻的认识。
水平有限还请各位大佬指正。如果觉得对你有帮助的话还请三连关注一波。希望大家都能拿到心仪的offer哦。 每日gitee侠今天你交gitee了嘛