C语言——文件初识_c语言文件w是覆盖吗-程序员宅基地

技术标签: c语言  C语言基础知识  文件名  文件指针  

1.什么是文件

磁盘中的文件是文件,键盘是文件,显示器也是文件,所以有一句话叫做一切皆文件。
但是从程序设计角度来说,文件一般有两种,程序文件和数据文件;
程序文件:包含源程序文件(.c后缀),目标文件(windows环境后缀.obj),可执行文件(windows环境.exe);
数据文件:程序运行时读取或输出的数据;
接下来谈的主要是数据文件;

2.为什么使用文件

程序运行时数据都是保存在内存之中,当退出程序这些数据就会消失;比如通讯录小程序,我们输入了联系人信息,一旦退出又要重新输入数据,这样的通讯录就没有了意义。而当我们退出程序将数据保存在磁盘文件之中,运行程序时再将数据读取出来,这样就将信息做到了持久化保存;

3.文件名

我们使用一个文件必须知道这个文件的名字,一个文件名通常包含3个部分:文件路径+文件名主干+文件后缀;
比如:e\project\file.log
文件路径:e盘之中的project 文件名主干:file 文件名后缀:log
在这里插入图片描述

4.如何使用

要使用文件,首先我们要将一个文件打开,文件打开的函数是:FILE * fopen ( const char * filename, const char * mode );;
形参列表之中:filename表示的是打开文件的名字,mode表示的是打开的方式是读取还是写入。返回值是一个文件指针,下面来演示一下:
在这里插入图片描述

在这里插入图片描述
上面进行了初步的演示,接下来我将继续介绍文件指针,文件的读写方式;

5.文件指针

在这里插入图片描述
上面打开文件演示中的FILE *fp即定义的文件指针变量,用来接收文件信息区的地址,通过这个指针变量就可以访问到与文件信息对应的文件;

6.文件的使用方式

文件使用方式 含义
“r” 为输入打开一个文本文件
“w” 为输出打开一个文本文件
“a” 向文本文件尾增加数据
“rb” 为输入打开一个二进制文件
“wb” 为输出打开一个二进制文件
“ab” 向二进制文件尾增加数据
“r+” 为读/写打开一个文本文件
“w+” 为读/写建立一个新的文本文件
“a+” 打开一个文件在文件尾进行续写
“rb+” 为读/写打开一个二进制文件
“wb+” 为读/写建立一个新的二进制文件
“ab+” 打开一个二进制文件,在文件尾进行读和写

上述表格看起来复杂,其实只要知道:
1.w对应的是文本文件的输出,是覆盖式写入,当打开的文件不存在时会创建一个文件。
下面动图展示了“w”方式的覆盖式写入
在这里插入图片描述

2.r对应的是文本文件的输入,当打开的文件不存在时会打开失败。
在这里插入图片描述

3.是对文本文件进行续写,是在文件末尾续写,当打开文件不存在时会打开失败。
经过验证,在vs2013,当打开文件不存在时也会自动创建一个新的文件;下面动图演示“a”在文件尾进行续写
在这里插入图片描述

4.b对应的是二进制文件,只要在上述四种方式后面加上b就是对应的二进制文件;

5.“+”表示的是读写一体,同样只要在上述方式后端添上“+”;

7.文件的读写函数

在这里插入图片描述
下面演示两个字符输入函数的使用;
7.1getc演示:
在这里插入图片描述
7.2fputc演示:
在这里插入图片描述

8.文件指针调整函数

8.1 fseek:根据文件指针的位置和偏移量来定位文件指针在这里插入图片描述
演示:
在这里插入图片描述

9. long int ftell(FILE stream):返回文件指针相对于起始位置的偏移量

在这里插入图片描述

10.rewind:读写位置恢复到最开始

在这里插入图片描述

11.文本文件和二进制文件

文本文件:对人友好,将文件内容转化为对应的ASCII码值对应的符号
在这里插入图片描述

二进制文件:直接将对应的补码储存到文件之中,即内存里面什么样,文件之中也是什么样
在这里插入图片描述

12.文件读取结束的判定feof

文件读取结束的判定
文本文件的判定:
在使用feof的使用必须让文件一直读取,读取到出错再用feof判断返回值是否为文件的结尾;
fgetc判断是否为EOF,fgets判断是否为NULL;
因为文件读取出错的时候也有可能返回EOF,即因为其他因素而导致结束读取,这时候就需要用feof来判定返回值EOF是否为读取结束;
演示:
在这里插入图片描述
二进制文件读取结束判定
二进制文件的读结束判定为:判定返回值是否小于实际要读的个数
因为当fread读取返回值一直等于要读取的个数(满足期望值)即会一直读取下去,当返回值小于期望值时就不会再读了;

成功演示
在这里插入图片描述

失败演示
在这里插入图片描述

13.文件缓冲区

先上理论:
c语言默认提供缓冲机制
常见缓冲机制有:无缓冲,行缓冲,全缓冲
普通文件写入采用全缓冲
显示器文件写入采用行缓冲
所谓的缓冲区本质就是一块内存,存在的最大价值就是为了提升程序的效率;

在这里插入图片描述
引申
因为缓冲区的存在,需要刷新缓冲区或者文件操作结束的时候关闭文件,否则可能导致文件读写问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ych9527/article/details/110431281

智能推荐

Python 入门的60个基础练习_练习python基础语法-程序员宅基地

文章浏览阅读4.2w次,点赞329次,收藏2.7k次。Python 入门的60个基础练习_练习python基础语法

iOS6和iOS7代码的适配(2)——status bar_ios7 statusbar-程序员宅基地

文章浏览阅读1w次。用Xcode5运行一下应用,第一个看到的就是status bar的变化。在iOS6中,status bar是系统在处理,应用_ios7 statusbar

gdb调试时No symbol "var" defined in current context && No Register_no registers调试显示-程序员宅基地

文章浏览阅读2.1k次。问题描述:,在gdb调试程序输出变量:p var,会提示No symbol "var" in current context.原因:程序编译时开启了优化选项,那么在用GDB调试被优化过的程序时,可能会发生某些变量不能访问,或是取值错误码的情况。这个是很正常的,因为优化程序会删改程序,整理程序的语句顺序,剔除一些无意义的变量等,所以在GDB调试这种程序时,运行时的指令和你所编写指_no registers调试显示

IDGeneratorUtil 主键id生成工具类_idgeneratorutils.generateid()-程序员宅基地

文章浏览阅读3.4k次。import java.util.Random;import org.drools.util.UUIDGenerator;/** * * * 类名称:GenerateIdUtil * 类描述: 主键生成工具类 * @author chenly * 创建时间:Jul 10, 2012 8:10:43 AM * 修改人: * 修改时间:Jul 10, 2012 8..._idgeneratorutils.generateid()

关于汇编 BX 和 BLX 跳转指令_汇编blx-程序员宅基地

文章浏览阅读5k次。BX:跳转到寄存器reg给出的目的地址处,如:BX R2BLX:跳转到寄存区reg给出的目的地址处并将返回地址存储到LR(R14)使用这两个指令时有一点特别需要注意:跳转的目的地址必须是奇数,若不是奇数则在后面加1,如某函数的起始地址是0x80000f00,则要跳转到此函数则应该跳转到0x80000f01处!否则会进入硬件错误中断!..._汇编blx

前端vue,打包整合进后端springboot的resources里面后,运行只要刷新就报404_前端项目放入resource-程序员宅基地

文章浏览阅读2.6k次,点赞2次,收藏4次。vue打包后,其实就剩index.html和一堆静态资源,页面的加载和替换都是通过刷新index.html种的dom来实现的(应该是这样,可能表述不是很好),所以做个重定向就可以了。(博主是这么解决的,网上还有很多人是各种路径错误,大家可以尝试下自己是哪个原因)import org.springframework.boot.web.server.ConfigurableWebServerFa..._前端项目放入resource

随便推点

添加远程github仓库时报错 Warning: Permanently added the RSA host key for IP address 52.74.223.119_cmd warning: permanently added-程序员宅基地

文章浏览阅读9.7k次。1.问题展示2.解决方案1.任意窗口, 打开git bash2.命令行界面, 输入cd C:3.cat ~/.ssh/id_rsa.pub正常下面应该显示一大串公钥如果没有,显示如下图, 则进行下一步, 创建公钥4.创建公钥, 输入 ssh-keygen5.然后一直下一步, 直到出现6.再次输入cat ~/.ssh/id_rsa.pub下面一大串数字便是公钥,复制这些字符串, 打开github, 点击头像, 打开settings, 打开SSH and GPG Keys_cmd warning: permanently added

SQL*Plus 使用技巧1-程序员宅基地

文章浏览阅读154次。[code="java"]1. SQL/Plus 常用命令 a. help [topic] 查看命令的使用方法,topic表示需要查看的命令名称。 如: help desc; b. host 该命令可以从SQL*Plus环境切换到操作系统环境,以便执行操作系统命名。 c. host [command] 在sql*plus环境中执行操作系统命令,如:host notepad.exe..._sql+plus的使用方法

域控服务器搭建与管理论文,校园网络服务器的配置与管理 毕业论文.doc-程序员宅基地

文章浏览阅读441次。该文档均来自互联网,如果侵犯了您的个人权益,请联系我们将立即删除!**学校毕 业 论 文**学校园网络服务器的配置与管理姓 名: **学 号: **指导老师:系 名:专 业: 计算机网络技术班 级:二0一一年十二月十五日摘 要随着网络技术的不断发展和Internet的日益普及,许多学校都建立了校园网络并投入使用,这无疑对加快信息处理,提高工作效..._服务器配置与应用论文

mysql单实例多库与多实例单库_数据库单实例和多实例-程序员宅基地

文章浏览阅读1k次。一、单实例多库:一个mysql实例,创建多个数据目录。规划:实例路径:/usr/local/mysql数据目录路径:(1)/usr/local/mysql/data(2)/usr/local/mysql/data2步骤:安装mysql。配置my.cnf文件。初始化各个数据库。用mysqld_multi启动。1、安装mysql。平常安装。2、m..._数据库单实例和多实例

MFC解决找不到MFC90.DLL的问题_microsoft v90.debugmfc-程序员宅基地

文章浏览阅读6.3k次。今天装了第三方的MFC软件库Xtreme ToolkitPro v15.0.1,听说搞MFC的人都知道它的强大,我刚学习,所以装了一个,然后想运行一下它自带的例子看看。出现一个“找不到mfc90.dll“的问题,百度一下,记录如下:vs2008已经打过sp1补丁,编译C++程序会提示找不到mfc90.dll文件的错误,但是如果是release版的话就能正常运行csdn看到解决方案,粘贴_microsoft v90.debugmfc

XeLaTeX-中文排版解决方案_latex 中文排版 texlive-程序员宅基地

文章浏览阅读2.1k次。以前使用CJK进行中文的排版,需要自己生成字体库,近日,出现了XeTeX,可以比较好的解决中文字体问题,不需要额外生成LaTeX字体库,直接使用计算机系统里的字体,本文以在Linux下为例说明XeTeX的使用。操作系统: UbuntuTeX:除了texlive包外,还需要安装的包是texlive-xetex。字体:可以使用fc-list查看你自己的字体库,注意字体的完整名称,在XeTe..._latex 中文排版 texlive