C语言文件操作(1)

C语言文件操作(1)

文章目录

  • C语言文件操作(1)
    • 一、理解文件
      • 1.概述
      • 2.分类
        • ①.正常角度
        • ②.文本文件和二进制文件
    • 二、文件的打开和关闭
      • 1.流和标准流
      • 2.文件类型指针
      • 3.文件的打开和关闭以及使用类型
    • 三、文件缓冲区

一、理解文件

1.概述

首先,我们要知道文件都是存储在磁盘上的,而我们平时写在编译器上写的代码等在保存之前都是存储在内存中的,也即带电存储,计算机内存是一种临时存储器,它的内容在计算机关闭或重启时会被清除,或者程序退出,内存回收,数据就丢失了。

如果想要永久化的保存数据,我们可以使用存储在磁盘上的文件。

2.分类

①.正常角度

从程序设计的角度来看,文件主要分为程序文件和数据文件。程序文件也就是我们常说的.c .obj .exe文件。

而在编程过程中的文件操作主要操作的就是数据文件,程序运行时读取数据的文件和程序运行时输出内容的文件。

注意:

程序中的数据 ———> 磁盘中的文件,这叫输出,即写

程序中的数据 <——— 磁盘中的文件,这叫输入,即读

输出输入是相对于程序中的数据来说的。

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

根据数据的存储形式,数据文件被称为文本文件或者二进制文件。

数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存,就是二进制文件。

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。

在内存中,字符⼀律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用⼆进制形式存储。

举个例子:

将100以二进制形式写到文件里,出现不认识的函数大家不用担心,后续都会提到的呀!

#include <errno.h>
int main()
{int a = 100;FILE* fp = fopen("test.txt", "wb");if (fp == NULL){perror("fopen");return 1;}fwrite(&a, 4, 1, fp);fclose(fp);fp = NULL;return 0;
}

那让我们一起来验证一下:
1.将这个文件拖到源文件下面
2.右键点击打开方式选项在这里插入图片描述
3.选择二进制编辑器
在这里插入图片描述

二、文件的打开和关闭

1.流和标准流

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。

C程序针对文件、画面、键盘等的数据输入输出操作都是同流操作的。一般情况下,我们要想向流里写数据,或者从流中读取数据,都是要打开流,然后操作。

那为什么我们从键盘输入数据,向屏幕上输出数据,并没有打开流呢?

那是因为C语言程序在启动的时候,默认打开了3个流:

stdin - 标准输入流,在大多数的环境中从键盘输入。

stdout - 标准输出流,在大多数的环境中输出至显示器界面。

stderr - 标准错误流,在大多数环境中输出到显示器界面。

这是默认打开了这三个流,我们使scanf、printf等函数就可以直接进行输入输出操作的。

2.文件类型指针

在使用文件,打开文件时,文件都会在内存中创建一个“文件信息区”,存放文件的相关信息,这些信息都保存在一个结构体变量里,FILE是这个结构体类型,创建一个FILE*类型的指针,可以指向这个文件信息区,并且通过文件信息来访问这个文件,通过文件指针变量能够间接找到这个与他关联的文件。

stdin、stdout、stderr三个流的类型是: FILE* ,通常称为文件指针。C语言中,就是通过 FILE* 的文件指针来维护流的各种操作的。

3.文件的打开和关闭以及使用类型

文件的打开和关闭,是依赖与fopen函数和fclose函数

//文件的打开
FILE* fp = fopen("test.txt", "wb");//注意:文件名和打开模式都是两个双引号if (fp == NULL){perror("fopen");return 1;}
//文件的关闭fclose(fp);fp = NULL;

fopen打开成功返回文件信息区的地址,打开失败返回NULL。

FILE * fopen ( const char * filename, const char * mode );

下面让我们一起来看看mode,也就是文件的打开模式

首先,我们来看一下"r"和"w"

r:文件必须存在,不存在的话则打开失败

w:如果文件存在会清空原来内容,相当于变成空文件,如果不存在,则创建一个新的文件。
更多有关mode的类型,可以点开这个链接。
fopen的mode

三、文件缓冲区

ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每⼀个正在使用的文件开辟⼀块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

int main()
{FILE* pf = fopen("test.txt", "w");fputs("abcdef", pf);//先将代码放在输出缓冲区printf("睡眠10秒-已经写数据了,打开test.txt文件,发现文件没有内容\n");Sleep(10000);printf("刷新缓冲区\n");fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到文件(磁盘)//注:fflush 在高版本的VS上不能使用了printf("再睡眠10秒-此时,再次打开test.tx文件,文件有内容了\n");Sleep(10000);//避免是fclose的影响fclose(pf);//注:fclose在关闭文件的时候,也会刷新缓冲区pf = NULL;return 0;
}

因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/115865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【iOS】JSONModel的基本使用

文章目录 前言一、导入JSONModel二、JSONModel的基本使用1.基本用法2.模型集合3.模型导出为NSDictionary或JSON4.设置所有属性可选&#xff08;所有属性值可以为空&#xff09;5.下划线(蛇式)转驼峰命名法 前言 JSONModel 是一个用于 Objective-C 的开源库&#xff0c;它用于简…

Android View拖拽startDragAndDrop,Kotlin

Android View拖拽startDragAndDrop&#xff0c;Kotlin import android.os.Bundle import android.util.Log import android.view.DragEvent import android.view.View import android.view.View.OnDragListener import android.view.View.OnLongClickListener import android.w…

后台管理系统SQL注入漏洞

对于edu来说&#xff0c;是新人挖洞较好的平台&#xff0c;本次记录一次走运的捡漏0x01 前景 在进行fofa盲打站点的时候&#xff0c;来到了一个后台管理处看到集市二字&#xff0c;应该是edu站点 确认目标身份&#xff08;使用的quake进行然后去ipc备案查询&#xff09; 网…

寻找二叉树一个节点的后继节点

后继节点&#xff1a;中序遍历的后一个节点 普通二叉树&#xff1a;中序遍历得到一个list&#xff0c;时间复杂度O(n) 本题的二叉树&#xff1a;有父节点的指针&#xff0c;后继节点与原节点的距离为1&#xff0c;因此可以直接通过父节点找到下一个节点 优化&#xff1a;节点…

Mac 开机提示Google LLC 注册 无法登录进入系统

Google LLC 会在电脑启动时提示如下弹窗&#xff0c;并要求登录谷歌账户进行验证 此时很明显没有用来进行验证的账号&#xff0c;所以需要关掉这个验证程序 从日志里面可以看到LLC启动了一个Tiny.app的程序 只需要想办法把这个程序删掉即可 关机 按住 Command R 开机 进入R…

华为OD 机智的外卖员(100分)【java】A卷+B卷

华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…

Openssl数据安全传输平台004:Socket C-API封装为C++类 / 服务端及客户端代码框架和实现

文章目录 0. 代码仓库1. 客户端C API2. 客户端C API的封装分析2.1 sckClient_init()和sckClient_destroy()2.2 sckClient_connect2.3 sckClient_closeconn()2.4 sckClient_send()2.5 sckClient_rev()2.6 sck_FreeMem 3. 客户端C API4. 服务端C API5. 服务端C6. 客户端和服务端代…

【算法优选】 前缀和专题——贰

文章目录 &#x1f60e;前言&#x1f334;[寻找数组的中心下标](https://leetcode.cn/problems/find-pivot-index/description/)&#x1f6a9;题目描述&#x1f6a9;算法思路&#xff1a;&#x1f6a9;代码实现 &#x1f38b;[除自身以外数组的乘积](https://leetcode.cn/probl…

【MySQL架构篇】MySQL字符集、大小写规范及默认数据库

文章目录 1. 字符集与字符集比较规则2. 大小写规范3. 默认数据库4. 与文件系统相关 1. 字符集与字符集比较规则 MySQL有4个级别的字符集和比较规则&#xff0c;分别是 服务器级别数据库级别表级别列级别 当创建对应表或列未指定字符集时&#xff0c;默认会取其上一级别的字符…

stream流相关操作

stream真的没有什么好说的&#xff0c;filter、map这俩常用的程序可以说每天都要写好几遍&#xff0c;那么问题来了&#xff0c;为什么还要拿出来讲讲呢&#xff1f;当然不可能是因为想要划水&#xff0c;主要是工作中它的其他相关方法也有不少涉及。以下是按照不同需求涉及到的…

docker 安装 Centos7

1. 从docker 安装 Centos7 查看有哪些 centos7 系统&#xff1a;docker search centos72. 安装 centos7 docker pull docker.io/ansible/centos7-ansible3.使用镜像创建容器 docker run -itd -p 8022:22 --namevm01 -v /bodata:/bodata -h vm01 --privilegedtrue 688353a31…

#力扣:面试题 02.03. 删除中间节点@FDDLC

面试题 02.03. 删除中间节点 - 力扣&#xff08;LeetCode&#xff09; 一、Java /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val x; }* }*/ class Solution {public void deleteNode(List…

华为OD 字符串统计(全量和占用字符集)(100分)【java】B卷

华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…

如何能通过表面挖掘到深层次的底层思维?

如何能通过表面挖掘到深层次的底层思维&#xff1f; 挖掘深层次的底层思维是一项复杂且细致的工作&#xff0c;通常涉及到个人反思、观察、沟通和分析等多个方面。下面是一些可能会对你有帮助的策略和方法&#xff1a; 1. 提问的艺术 五次为什么&#xff1a;这是一种简单而有…

flutter doctor检测环境,出现CocoaPods installed but not working

1. 安装flutter, 地址: 安装和环境配置 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 2. 安装成功后&#xff0c;通过flutter doctor检测环境。以mac为例&#xff0c;出现了CocoaPods installed but not working 错误提示时&#xff0c;以下为解决方案: 2.1 rvm i…

java实现邮件发送

一 申请授权码 具体申请方式请自行百度&#xff0c;很简单的 二 163网易邮箱发送 2.1 导入pom <dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><version>1.6.2</version></dependency> 2…

matlab逐像元计算栅格数据10年间的变化趋势代码

% 指定目标文件夹的路径 folder_path E:\; % 替换为目标文件夹路径% 使用 dir 函数列出目标文件夹下的指定位置的文件 file_pattern *.tif; % 例如&#xff0c;获取所有扩展名为".tif"的文件 files dir(fullfile(folder_path, file_pattern)); % 装载文件 dataLis…

QtCreator 查看类帮助文档,快捷键操作:按两次F1 全屏帮助,Esc取消全屏

如何查看类帮助文档 选择类&#xff0c;按F1查看类帮助文档。 示例&#xff1a; #include <QLabel> // 将光标放在QLabel上&#xff0c;按F1右侧弹出的类帮助手册可视宽度很小&#xff0c;如果按两次 F1 键&#xff0c;帮助文档将会以全屏模式显示&#xff0c;以便更清…

Linux高性能编程学习-TCP/IP协议族

一、TCP/IP协议族结构与主要协议 分层&#xff1a;数据链路层、网络层、传输层、应用层 1. 数据链路层 功能&#xff1a;实现网卡驱动程序&#xff0c;处理数据在不同物理介质的传输 协议&#xff1a; ARP&#xff1a;将目标机器的IP地址转成MAC地址RARP&#xff1a;将MAC地…

2023年10月小程序云开发cms内容管理无法使用,无法同步内容模型到云开发数据库的解决方案

一&#xff0c;问题描述 最近越来越多的同学找石头哥&#xff0c;说cms用不了&#xff0c;其实是小程序官方最近又搞大动作了&#xff0c;偷偷的升级的云开发cms&#xff08;内容管理&#xff09;以下都称cms&#xff0c;不升级不要紧&#xff0c;这一升级&#xff0c;就导致我…