当前位置: 首页 > news >正文

【嵌入式高级C语言】10:C语言文件

文章目录

  • 1 文件的概述
    • 1.1 文件分类(存储介质)
    • 1.2 磁盘文件分类(存储方式)
    • 1.3 二进制文件和文本文件的区别
  • 2 文件缓冲区
  • 3 文件指针
  • 4 文件的API
    • 4.1 打开文件
    • 4.2 关闭文件
    • 4.3 重新定位流
      • 4.3.1 fseek
      • 4.3.2 ftell
      • 4.3.3 rewind
    • 4.4 字符输出到文件
    • 4.5 字符串输出到文件
    • 4.6 字符的输入
    • 4.7 字符串的输入
    • 4.8 二进制流输出
    • 4.9 二进制流输入
  • 5 示例

1 文件的概述

1.1 文件分类(存储介质)

image.png

1.2 磁盘文件分类(存储方式)

  1. 从物理的角度看

任何磁盘文件在物理上都是二进制存储的。


  1. 从逻辑的角度看


1.3 二进制文件和文本文件的区别

image.png
image.png

2 文件缓冲区

image.png

文件缓冲区的作用:提高访问效率,提高磁盘使用寿命。

Linux下缓冲区的4种刷新方式

  1. 行刷新(遇到换行符刷新)。
  2. 满刷新(缓冲区数据放满刷新)。
  3. 强制刷新(使用fflush函数将缓冲区刷新)。
  4. 关闭刷新(关闭文件时将缓冲区数据全部刷新)。

fflush()详解

fflush - 刷新流
对于输出流,fflush()通过流的底层写入函数,强制写入所有的用户空间缓存数据到给定的输出或者更新流。
如果流的参数为NULLfflush()会刷新所有打开的输出流。概要#include <stdio.h>int fflush(FILE *stream);参数stream - 流返回值成功完成后返回 0。否则,返回 EOF 并返回 errno设置以指示错误。

示例:制作模拟时钟

#include <stdio.h>
#include <unistd.h>int main(int argc, char **argv)
{int min = 0;int sec = 0;while (1){// 输出时钟printf("\r%02d:%02d", min, sec);// 刷新缓冲区fflush(stdout);// 睡眠1秒sleep(1);// 时钟逻辑判断sec++;if (60 == sec){sec = 0;min++;if (60 == min){min = 0;} /* end of if (60 == min) */} /* end of if (60 == sec) */} /* end of while (1) */return 0;
}

3 文件指针

所有操作文件的库函数都需要借助文件指针操作文件。

  1. 定义文件指针的一般形式为FILE *指针变量标识符,FILE为大写,需包含<stdio.h>
  2. FILE是系统使用typedef定义出来的有关文件信息的一种结构体变量,含有文件名、文件状态和文件当前位置等信息。
  3. 一般情况下,我们操作文件前必须定义一个文件指针来标示我们将要操作的文件。
  4. 在实际编程中,我们无需关心FILE结构体的细节,只需要将文件指针传给io库函数,库函数再通过结构体里的信息对文件进行操作。

对文件操作的步骤

  1. 对文件进行读写等操作之前要打开文件得到文件指针。
  2. 可以通过文件指针对文件进行读写操作。
  3. 读写等操作完毕后,需要关闭文件,关闭文件后,就不能再通过此文件指针操作文件了。

补充:在C语言中有三个特殊的文件指针无需定义,在程序中可以直接使用(每个进程)

  • stdin:标准输入。–> 默认为当前终端(键盘)
  • stdout:标准输出。–> 默认为当前终端(屏幕)
  • stderr:标准错误输出设备。–> 默认为当前终端(屏幕)

4 文件的API

4.1 打开文件

fopen - 流打开函数
fopen() 函数打开名称为路径名指向的字符串的文件并将流与其关联。概要#include <stdio.h>FILE *fopen(const char *pathname, const char *mode);参数pathname - 文件路径名mode - 文件打开模式r    打开文本文件进行读取。该流位于文件开头。r+   打开以进行读取和写入。该流位于文件开头。w    将文件截断为零长度或创建用于写入的文本文件。流是位于文件的开头。w+   打开以进行读取和写入。如果文件不存在则创建,否则它会被截断。该流位于该流的文件开头。a    打开以追加(写入文件末尾)。如果不存在则创建该文件。该流位于文件末尾。a+   打开以进行读取和追加(写入文件末尾)。该文件不存在则创建。输出总是附加到末尾文件。返回值成功完成后,fopen()fdopen()freopen() 返回一个 FILE 指针。否则,返回 NULL 并设置 errno 来指示错误。

image.png

4.2 关闭文件

fclose - 关闭流
fclose() 函数刷新流指向的流(写入任何缓冲的使用 fflush(3)) 输出数据并关闭底层文件描述符。概要#include <stdio.h>int fclose(FILE *stream);参数stream - 文件流返回值成功完成后,返回 0。否则,返回 EOF 并返回 errno设置以指示错误。

4.3 重新定位流

4.3.1 fseek

fseek - 重新定位流
fseek() 函数设置流指向的流的文件位置指示符。新位置(以字节为单位)是通过将偏移字节添加到由whence指定的位置。
如果whence设置为SEEK_SETSEEK_CURSEEK_END,偏移量相对于文件的开头,指示符当前位置或文件结尾。概要#include <stdio.h>int fseek(FILE *stream, long offset, int whence);参数stream - 文件流offset - 偏移量whence - 流指针位置SEEK_SET - 文件的开头SEEK_CUR - 指示符当前位置SEEK_END - 文件结尾返回值成功完成后,返回0。否则,-1返回并设置 errno 以指示错误。

4.3.2 ftell

ftell - 重新定位流
ftell() 函数获取stream 指向的流的文件位置指示符的当前值。概要#include <stdio.h>long ftell(FILE *stream);参数stream - 文件流返回值成功完成后ftell() 返回当前偏移量。否则,-1返回并设置 errno 以指示错误。

4.3.3 rewind

rewind - 重新定位流
rewind() 函数设置指向的流的文件位置指示器流到文件的开头。
相当于 fseek(stream, 0L, SEEK_SET);概要#include <stdio.h>void rewind(FILE *stream);参数stream - 文件流返回值rewind() 函数不返回任何值。

4.4 字符输出到文件

fputc - 字符输出到文件
fputc() 将字符 c 写入流,转换为无符号字符。概要#include <stdio.h>int fputc(int c, FILE *stream);参数c - 字符stream - 文件流返回值返回以 unsigned char 形式写入的字符;出错时转换为 intEOF

4.5 字符串输出到文件

fputs - 字符串输出到文件
fputs() 将字符串 s 写入流,不带终止空字节 ('\0')。概要#include <stdio.h>int fputs(const char *s, FILE *stream);参数s - 字符串首地址stream - 文件流返回值成功时返回一个非负数,在错误时返回 EOF

4.6 字符的输入

fgetc - 字符的输入
fgetc() 从流中读取下一个字符并将其作为无符号字符返回;
在文件末尾或发生错误时转换为 intEOF。概要#include <stdio.h>int fgetc(FILE *stream);参数stream - 文件流返回值返回作为 unsigned char 转换读取的字符;文件末尾或错误时为 intEOF

4.7 字符串的输入

fgets - 字符串的输入
fgets() 从流中最多读取一个小于 size 的字符并将它们存储到s指向的缓冲区中。
读取在 EOF 或换行符后停止。如果读取换行符,则将其存储到缓冲区中。一个术语空字节('\0')存储在缓冲区中最后一个字符之后。概要#include <stdio.h>char *fgets(char *s, int size, FILE *stream);参数s - 缓冲区地址size - 缓冲区总大小stream - 流返回值fgets() 成功时返回 s,出错时或在未读取字符的情况下发生文件末尾时返回 NULL。注意不建议将对 stdio 库的输入函数的调用与对 read(2) 的低级调用混合使用与输入流关联的文件描述符;结果将是不确定的,很可能不是你要。

4.8 二进制流输出

fwrite - 二进制流输出
函数 fwrite() 将 nmemb 数据项(每个大小size)写入Stream 指向的流,从 ptr 给出的位置获取它们。概要#include <stdio.h>size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);参数ptr - 写入数据的地址size - 块大小nmemb - 块数stream - 文件流返回值成功后,fwrite() 返回写入的项目数。这仅当 size 为 1 时,number 才等于传输的字节数。

4.9 二进制流输入

fread - 二进制流输入
函数 fread() 从以下位置读取 nmemb 数据项,每个大小为 size 长 Stream 指向的流,将它们存储在 ptr 指定的位置。概要#include <stdio.h>size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);参数ptr - 存储数据的地址size - 块大小nmemb - 块数stream - 文件流返回值成功后,fread() 返回读取的项目数。这仅当 size 为 1 时,number 才等于传输的字节数。注意fread() 不区分文件结束和错误,调用者必须使用feof(3)ferror(3) 来确定发生了哪一个。

5 示例

#include <stdio.h>int main(int argc, char **argv)
{FILE *fp = NULL;char str[128] = "hello world!";long ret = 0L;/* 打开文件 */fp = fopen("test", "w+");if (NULL == fp){perror("fopen");return -1;} /* end of if (NULL == fp) *//* 写入 */ret = fwrite(str, sizeof(char), sizeof(str), fp);printf("%ld\n", ret);/* 关闭文件 */fclose(fp);fp = NULL;return 0;
}
$ ./a.out 
128

image.png

相关文章:

【嵌入式高级C语言】10:C语言文件

文章目录 1 文件的概述1.1 文件分类&#xff08;存储介质&#xff09;1.2 磁盘文件分类&#xff08;存储方式&#xff09;1.3 二进制文件和文本文件的区别 2 文件缓冲区3 文件指针4 文件的API4.1 打开文件4.2 关闭文件4.3 重新定位流4.3.1 fseek4.3.2 ftell4.3.3 rewind 4.4 字…...

创建数据表

Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 如果要进行数据表的创建 create table 表名称 (列名称 类型 [DEFAULT 默认值 ] ,列名称 类型 [DEFAULT 默认值 ] ,列名称 类型 [DEFAULT 默认值 ] ,...列名称 类型 [DEFAULT 默认值 ] )…...

C语言字符串型常量

在C语言中&#xff0c;字符串型常量是由一系列字符组成的常量。字符串常量在C中以双引号&#xff08;"&#xff09;括起来&#xff0c;例如&#xff1a;“Hello, World!”。字符串常量在C中是不可变的&#xff0c;也就是说&#xff0c;一旦定义&#xff0c;就不能修改其内…...

计算机网络 八股

计算机网络体系结构 OSI&#xff1a;物理层、数据链路层、网络层、运输层、会话层、表示层、应用层...

深入了解 Jetpack Compose 中的 Modifier

Jetpack Compose 是 Android 中用于构建用户界面的现代化工具包。其中&#xff0c;Modifier 是一个非常重要的概念&#xff0c;它允许我们对 UI 组件进行各种样式和布局的调整。在本篇博客中&#xff0c;我们将深入了解 Modifier&#xff0c;以及如何在 Compose 中使用它。 什…...

【数据库】聚合函数|group by分组|having|where|排序|函数 关键字的使用

目录 一、聚合函数 1、max() 2、min() 3、avg() 4、sum() 5、count() 二、group by 分组汇总 一般聚合函数配合着group by(分组)语句进行使用 把一组的数据放到一起&#xff0c;再配合聚合函数进行使用 三、having having语句 做筛选的 四、where和having的作用以及区…...

docker安装mongoDB及使用

一.mongodb是什么&#xff1f; MongoDB是一个NoSQL的非关系型数据库 &#xff0c;支持海量数据存储&#xff0c;高性能的读写 1.mongo的体系结构 SQL术语/概念MongoDB术语/概念解释/说明databasedatabase数据库tablecollection数据库表/集合rowdocument数据记录行/文档colum…...

Linux 之五:权限管理(文件权限和用户管理)

1. 文件权限 在Linux系统中&#xff0c;文件权限是一个非常基础且重要的安全机制。它决定了用户和用户组对文件或目录的访问控制级别。 每个文件或目录都有一个包含9个字符的权限模式&#xff0c;这些字符分为三组&#xff0c;每组三个字符&#xff0c;分别对应文件所有者的权限…...

基于YOLOv8深度学习的葡萄病害智能诊断与防治系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…...

MySQL 在聚合函数查询的结构中继续过滤

HAVING HAVING 关键字和 WHERE 关键字都可以用来过滤数据&#xff0c;且 HAVING 支持 WHERE 关键字中所有的操作符和语法,如果想要从 GROUP BY 分组中进行筛选的话&#xff0c;不是用 WHERE 而是使用 HAVING 来进行聚合函数的筛选。 语法 SELECT <列名1>, <列名2>,…...

UE4.27_ParticleSystem(没写完的材料)

UE4.27_ParticleSystem&#xff08;没写完的材料&#xff09; 参考实例&#xff1a; UE4[蓝图]下雪效果及雪的材质的实现...

腾讯云轻量服务器流量用完了怎么办?停机吗?

腾讯云轻量服务器流量用完了怎么办&#xff1f;超额流量另外支付流量费&#xff0c;流量价格为0.8元/GB&#xff0c;会自动扣你的腾讯云余额&#xff0c;如果你的腾讯云账号余额不足&#xff0c;那么你的轻量应用服务器会面临停机&#xff0c;停机后外网无法访问&#xff0c;继…...

块级作用域、变量提升

1.块级作用域 JS 中作用域有&#xff1a;全局作用域、函数作用域。没有块作用域的概念。ECMAScript 6(简称 ES6)中新增了块级作用域。块作用域由 { } 包括&#xff0c;if 语句和 for 语句里面的{ }也属于块作用域。 2.变量提升 如果变量声明在函数里面&#xff0c;则将变量声…...

c# 连接oracle 及对应获取数据集

1、数据库配置xml&#xff0c;首先连接成功后会自动创建xml并保存到对应xml&#xff0c;如下 static string ConnPath AppDomain.CurrentDomain.BaseDirectory "ConnOrcle.xml"; 声明xml名称&#xff0c;便于后续写入对应数据库参数 2、创建xml /// <summar…...

JS直接量及其相关对象

什么是直接量 直接量是指不需要创建对象就可以直接使用的变量。ES中的直接量主要有三种类型&#xff1a;表示字符串的string类型、表示数字的number类型和表示true/false的boolean类型。当我们直接将值赋给变量后&#xff0c;ES就会自动判断其类型&#xff0c;而且当参数发生变…...

一 windso10 笔记本刷linux cent os7.9系统

1:准备材料 16G以上U盘, 笔记本一台 镜像选了阿里云镜像:centos-7-isos-x86_64安装包下载_开源镜像站-阿里云 软件:链接&#xff1a;https://pan.baidu.com/s/13WDp2bBU1Pdx4gRDfmBetg 提取码&#xff1a;09s3 2:把镜像写入U盘,本人已经写入好了,选择镜像,点开始就是,确定等…...

118.龙芯2k1000-pmon(17)-制作ramdisk

目前手上这个设备装系统不容易&#xff0c;总是需要借助虚拟机才能实现。 对生产就不太那么友好&#xff0c;能否不用虚拟机就能装Linux系统呢&#xff1f; 主要是文件系统的问题需要解决&#xff0c;平时我们一般是用nfs挂载后&#xff0c;然后对硬盘格式化&#xff0c;之后…...

IP-guard邮件管控再升级,记录屏幕画面,智能阻断泄密邮件

邮件是工作沟通以及文件传输的重要工具,却也成为了信息泄露的常见渠道。员工通过邮件对外发送了什么内容,是否含有敏感信息都无从得知,机密通过邮件渠道外泄也难以制止。想要防止企业的重要信息通过邮件方式泄露,我们不仅需要通过技术措施对外发邮件的行为进行规范,也要对…...

#LLM入门|Prompt#2.10_评估、自动化测试效果(下)——当不存在一个简单的正确答案时 Evaluation Part2

上一章我们探索了如何评估 LLM 模型在 有明确正确答案 的情况下的性能&#xff0c;并且我们学会了编写一个函数来验证 LLM 是否正确地进行了分类列出产品。 在使用LLM生成文本的场景下&#xff0c;评估其回答准确率可以是一个挑战。由于LLM是基于大规模的训练数据进行训练的&am…...

round四舍五入在python2与python3版本间区别

round()方法返回数值的小数点四舍五入到n个数字。 语法 以下是round()方法的语法&#xff1a; round( x ,n) 参数 x --这是一个数值&#xff0c;表示需要格式化的数值 n --这也是一个数值,表示小数点后保留多少位 返回值 该方法返回 数值x 的小数点四舍五入到n个数字 …...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...