C语言进阶 13. 文件
C语言进阶 13. 文件
文章目录
- C语言进阶 13. 文件
- 13.1. 格式化输入输出
- 13.2. 文件输入输出
- 13.3. 二进制文件
- 13.4. 按位运算
- 13.5. 移位运算
- 13.6. 位运算例子
- 13.7. 位段
13.1. 格式化输入输出
-
格式化输入输出:
- printf
- %[flags][width][.prec][hlL]type
- scanf
- %[flags]type
- printf
-
%[flags][width][.prec][hlL]type:
flags 含义- 左对齐+ 在前面放+或-(space) 正数留空0 0填充width或prec 含义number 最小字符数* 下一个参数是字符数.number 小数点后的数字.* 下一个参数是小数点后的位数hlL 含义hh 单个字节byteh shortl longll long longL long doubletype 用于i或d intu unsigned into 八进制x 十六进制X 字母大写的十六进制f或F floate或E 指数g floatG floata或A 十六进制c chars 字符串p 指针n 读入/写出的个数 -
scanf: %[flags]type:
flag 含义* 跳过数字 最大字符数hh charh shortl long doublell long longL long doubletype 用于d inti int, 可以为十六进制或八进制u unsigned into 八进制x 十六进制a,e,f,g floatc chars 字符串p 指针[...] 所允许的字符[^,] 读到,为止 -
printf和scanf的返回值:
-
读入的项目数
-
输出的字符数
-
在要求严格的程序中, 应该判断每次调用scanf或printf的返回值, 从而了解程序运行中是否存在问题
-
#include <stdio.h>int main(int argc, char const* argv[]) {//printf("%9d", 123); // 123//printf("h\n");//printf("%-9d\n", 123);//123//printf("%+d\n", 123); //+123//printf("% d\n", 123); // 123//printf("%09d\n", 123);//000000123//printf("%9.2f\n", 123.0);// 123.00//printf("%*d\n", 6, 123); // 123//printf("%*.*f\n", 6, 2, 123.0);//123.00//printf("%hhd\n", 12345);//57, 只取了1byte, 前面的位全部省去//int num;//scanf("%*d%d", &num);//1 2//printf("%d\n", num);//2//int num2;//scanf("%i", &num2);//0x12//printf("%d\n", num2);//18//char s[10];//char s2[10];//char s3[10];//scanf("%[^,], %[^,], %[^,]", s, s2, s3);//1,2,3,//printf("%s %s %s\n", s, s2, s3);//1 2 3int num;int i1 = scanf("%d", &num);//123int i2 = printf("%d\n", num);//123printf("%d:%d\n", i1, i2);//1:4return 0;
}
13.2. 文件输入输出
-
重定向没听懂
-
文件输入输出:
-
用>和<做重定向
-
使用Linux和Windows系统的命令行都可以使用这种方式
> D:\C语言\C_code\Two_Advanced\13.File\13.0
-
-
FILE:
- 打开文件的标准代码
FILE* fp = fopen("fileName", "r"); //r: 只读 fopen: 没有打开返回NULLif (fp) {int num;fscanf(fp, "%d", &num);printf("%d\n", num);fclose(fp);}else {printf("无法打开文件\n");} -
fopen:
fopen("参数1", "参数2");参数1: 文件名参数2:r 只读r+ 读写, 从文件头开始w 只写, 如果不存在则新建, 如果存在则清空w+ 读写, 如果不存在则新建, 如果存在则清空a 追加, 如果不存在则新建, 如果存在则从文件尾开始..x 只新建, 如果文件已存在则不能打开
#include <stdio.h>
#include <string.h>int main(int argc, char const* argv[]) {FILE* fp = fopen("a.txt", "r");if (fp) {int num;fscanf(fp, "%d", &num);printf("%d\n", num);fclose(fp);}else {printf("无法打开文件\n");}return 0;
}
13.3. 二进制文件
-
后面的没听懂
-
二进制文件:
-
其实所有的文件最终都是二进制的
-
文本文件无非是用最简单的方式可以读写的文件
- more, tail
- cat
- vi
-
而二进制文件是需要专门的程序来读写的文件
-
文本文件的输入输出是格式化, 可能经过转码
-
-
文本 VS 二进制:
-
Unix喜欢用文本文件来做数据存储和程序配置
- 交互式终端的出现使得人们喜欢用文本和计算机"talk"
- Unix的shell提供了一些读写文本的小程序
-
Windows喜欢用二进制文件
- DOS是草根文化, 并不继承和熟悉Unix文化
- PC刚开始的时候能力有限, DOS的能力更有限, 二进制更接近底层
-
-
优缺点:
-
文本
- 优势是方便认类读写, 而且跨平台
- 缺点是程序输入输出要经过格式化, 开销大
-
二进制
- 缺点是认类读写困难, 而且不跨平台
- int的大小不一致, 大小端的问题…
- 优点是程序读写快
- 缺点是认类读写困难, 而且不跨平台
-
-
程序为什么要文件:
-
配置
- Unix用文本, Windows用注册表
-
数据
- 稍微有点量的数据都放数据库了
-
媒体
- 这个只能是二进制的
-
现实是, 程序通过第三方库来读写文件, 很少直接读写二进制文件了
-
-
二进制读写:
size_t fread(void* restrict ptr, size_t size, size_t nitems, FILE* restrict stream);读写的内存, 一个的大小, 一共多少个, 文件指针size_t fwrite(const void* restrict ptr, size_t size, size_t nitems, FILE* restrict stream);注意FILE指针是最后一个参数返回的是成功读写的字节数 -
为什么nitem?
-
因为二进制文件的读写一般都是通过哟对一个结构变量的操作来进行的
-
于是nitem就是用来说明这次读写几个结构变量
-
-
在文件中定位:
long ftell(FILE* stream);int fseek(FILE* stream, long offset, int whence);SEEK_SET: 从头开始SEEK_CUR: 从当前位置开始SEEK_END:从尾开始(倒过来) -
可移植性:
-
这样的二进制文件不具有可移植性
- 在int为32位的机器上写成的数据文件无法直接在int为64位的机器上正确的读出
-
解决方案之一是放弃使用int, 而是typedef具有明确大小的类型
-
更好的方案是文本
-
13.4. 按位运算
-
按位运算:
- C有这些按位运算的运算符, 位指的是二进制位
& 按位与| 按位或~ 按位取反^ 按位异或<< 左移>> 右移 -
按位与&:
-
如果(x)i == 1 并且 (y)i == 1, 那么(x & y)i = 1
-
否则(x & y)i = 0
-
按位与常用于两种应用
- 让某一位或某些位为0: x & 0xFE
- 取一个数中的一段: x & 0xFF




-
-
按位或|:
-
如果(x)i == 1 或 (y)i == 1, 那么(x | y)i = 1
-
否则(x | y)i = 0
-
按位或常用于两种应用
- 使得一位或几个位为1: x | 0x01
- 把两个数拼起来: 0x00FF | 0xFF00



-
-
按位取反~:
- (~x)i = 1 - (x)i
-
把1位变0, 0位变1
-
想得到全部位为1的数: ~0
-
7的二进制是0111, x | 7 使得低3位为1
-
x & ~7, 就使得低3位为0

-
- (~x)i = 1 - (x)i
-
逻辑运算 VS 按位运算:
-
对于逻辑运算, 它只看到两个值: 0和1
-
可以认为逻辑运算相当于把所有非0值都变成1, 然后做按位运算
5 & 4 -> 4 而 5 && 4 -> 1 & 1 -> 15 | 4 -> 5 而 5 || 4 -> 1 | 1 -> 1~4 -> -5 而 !4 -> !1 -> 0
-
-
按位异或:
-
如果(x)i == (y)i, 那么(x ^ y)i = 0
-
否则(x ^ y)i = 1
-
如果两个位相等, 那么结果为0, 不相等, 结果为1
-
如果x和y相等, 那么x^y的结果为0
-
对一个变量用同一个值异或两次, 等于什么也没做
x^y^y -> x

-
#include <stdio.h>int main(int argc, char const* argv[]) {unsigned char c = 0xAA;printf(" c = %hhx\n", c);// c = aaprintf("~c = %hhx\n", (char)~c);//~c = 55printf("-c = %hhx\n", (char)-c);//-c = 56printf("%d\n", ~5);return 0;
}
13.5. 移位运算
-
左移<<:
-
i << j
-
i中所有的位向左移j个位置, 而右边填入0
-
所有小于int的类型, 移位以int的方式来做, 结果是int
-
x << 1 等价于 x *= 2
-
x << n 等价于 x *= 2^n

-
-
右移>>:
-
i << j
-
i中所有的位向右移j个位置
-
所有小于int的类型, 移位以int的方式来做, 结果是int
-
对于unsigned的类型, 左边填入0
-
对于signed的类型, 左边填入原来的最高位(保持符号位不变)
-
x << 1 等价于 x *= 2
-
x << n 等价于 x *= 2^n
-
-
no zuo no die:
- 移位的位数不要用负数, 这是没有定义的行为
- x << -2 //!!NO!!
- 移位的位数不要用负数, 这是没有定义的行为
#include <stdio.h>int main(int argc, char const* argv[]) {//unsigned char a = 0xA5;//int n;//scanf("%d", &n);//printf("a = %hhx\n", a);//a = a5//printf("a << 2 == %hhx\n", a << 2);//a << 2 == 94//printf("a = %d\n", a);//a = 165//printf("a << 2 == %d\n", a << 2);//a << 2 == 660//printf("a << n == %d\n", a << n);int a = 0x80000000;//1000000000...000//11000000000...000unsigned int b = 0x80000000;printf("a = %d\n", a);//a = -2147483648printf("b = %u\n", b);//b = 2147483648printf("a >> 1 = %d\n", a >> 1);//a >> 1 = -1073741824printf("b >> 1 = %u\n", b >> 1);//b >> 1 = 1073741824return 0;
}
13.6. 位运算例子
-
后面讲的单片机部分不会
-
输出一个数的二进制:
-
跟着视频写的
//10000000000000000000000000000000
//000000000000000000000000000000001
//00000000000000000000000000011110#include <stdio.h>int main(int argc, char const* argv[]) {int num;scanf("%x", &num);//向左移31位, 这样最高位就变成了1unsigned int mask = 1u << 31;//每次循环让这个1右移1位, 直到mask为0for (; mask; mask >>= 1) {//num与mask, 循环遇到num出现1的位时, 输出1, 为0输出0printf("%d", num & mask ? 1 : 0);}printf("\n");return 0;
}
13.7. 位段
- 听不懂
- 位段:
-
把一个int的若干位组合成一个结构
struct {unsigned int leading : 3;unsigned int FLAG1 : 1;unsigned int FLAG2 : 2;int trailing : 11; }; -
可以直接用位段的成员名称来访问
- 比移位, 与, 或还方便
-
编译器会按排其中的位的排列, 不具有可移植性
-
当所需的位超过一个int时会采用多个int
-
#include <stdio.h>void prtBin(unsigned int num);struct U0 {unsigned int leading : 3;//成员leading后面加上一个冒号和一个3, 意思是成员leading占了3个bitunsigned int FLAG1 : 1;unsigned int FLAG2 : 2;int trailing : 32;
};int main(int argc, char const* argv[]) {struct U0 uu;uu.leading = 2;uu.FLAG1 = 0;uu.FLAG2 = 1;uu.trailing = 0;printf("sizeof(uu) = %lu\n", sizeof(uu));prtBin(*(int*)&uu);return 0;
}void prtBin(unsigned int num) {unsigned mask = 1u << 31;for (; mask; mask >>= 1) {printf("%d", num & mask ? 1 : 0);}printf("\n");
}
相关文章:
C语言进阶 13. 文件
C语言进阶 13. 文件 文章目录 C语言进阶 13. 文件13.1. 格式化输入输出13.2. 文件输入输出13.3. 二进制文件13.4. 按位运算13.5. 移位运算13.6. 位运算例子13.7. 位段 13.1. 格式化输入输出 格式化输入输出: printf %[flags][width][.prec][hlL]type scanf %[flags]type %[fl…...
LinuxCentos中ELK日志分析系统的部署(详细教程8K字)附图片
🏡作者主页:点击! 🐧Linux基础知识(初学):点击! 🐧Linux高级管理防护和群集专栏:点击! 🔐Linux中firewalld防火墙:点击! ⏰️创作…...
Vscode ssh Could not establish connection to
错误表现 上午还能正常用vs code连接服务器看代码,中午吃个饭关闭vscode再重新打开输入密码后就提示 Could not establish connection to xxxx 然后我用终端敲ssh的命令连接,结果是能正常连接。 解决方法 踩坑1 网上直接搜Could not establish con…...
数字陷波器的设计和仿真(Matlab+C)
目录 一、数字陷波器的模型 二、Matlab仿真 1. 示例1 2. 示例2 三、C语言仿真 1. 由系统函数计算差分方程 2. 示例代码 一、数字陷波器的模型 二、Matlab仿真 1. 示例1 clear clc f0=100;%滤掉的100Hz fs=1000;%大于两倍的信号最高频率 r=0.9; w0=2*pi*f0/fs;%转换到…...
[玄机]流量特征分析-常见攻击事件 tomcat
题目网址【玄机】:https://xj.edisec.net/ Tomcat是一个开源的Java Servlet容器,它实现了Java Servlet和JavaServer Pages (JSP) 技术,提供了一个运行这些应用程序的Web服务器环境。Tomcat由Apache软件基金会的Jakarta项目开发,是…...
【TOOLS】Project 2 Maven Central
发布自己的项目到maven中央仓库 Maven Central Account 访问:https://central.sonatype.com/,点击右上角,根据提示注册账号 构建User token ,用于访问中央仓库的API: 点击右上角,查看账户点击Generate Us…...
【Opencv】模糊
消除噪声 用该像素周围的平均值代替该像素值 4个函数 blur():最经典的 import os import cv2 img cv2.imread(os.path.join(.,dog.jpg)) k_size 7 #窗口大小,数字越大,模糊越强 img_blur cv2.blur(img,(k_size,k_size)) #窗口是正方形ÿ…...
函数式编程范式
文章目录 函数式编程范式不可变性(Immutable)纯函数(Pure Functions)函数作为一等公民(First-Class Functions)高阶函数(Higher-Order Functions函数组合(Function Composition&…...
特征缩放的秘籍:sklearn中的数据标准化技术
特征缩放的秘籍:sklearn中的数据标准化技术 在机器学习中,特征缩放(Feature Scaling)是数据预处理的重要步骤,它确保了不同量纲和范围的特征在模型训练中具有相同的重要性。Scikit-learn(简称sklearn&…...
hdfs文件系统
简述什么是HDFS,以及HDFS作用 ? HDFS在Hadoop中的作用是为海量的数据提供了存储,能提供高吞吐量的数据访问,HDFS有高容错性的 特点,并且设计用来部署在低廉的硬件上;而且它提供高吞吐量来访问应用程序的数…...
基于STM32设计的个人健康检测仪(华为云IOT)(191)
基于STM32设计的个人健康检测仪(华为云IOT)(191) 文章目录 一、设计需求1.1 设计需求总结1.2 设计思路【1】整体设计思路【2】整体构架【3】ESP8266模块配置【4】上位机开发思路【5】供电方式1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】课题研究的意义【…...
面试:CUDA Tiling 和 CPU tiling 技术详解
目录 一、CUDA Tiling 和 CPU Tiling 技术概述 (一)技术原理 (二)应用场景 (三)优势和劣势 二、Tiling 技术在深度学习中的应用 三、Tiling 技术的缺点 一、CUDA Tiling 和 CPU Tiling 技术概述 Til…...
SQL语句中,`TRUNCATE` 和 `DELETE`的区别
TRUNCATE 和 DELETE 是 SQL 中用于删除表中数据的两种命令,它们有一些关键区别: 1. 基本区别 DELETE: 删除表中的数据,但不会删除表结构和索引。可以使用 WHERE 子句来删除特定的记录,也可以不使用 WHERE 子句来删除所有记录。会…...
【Git】.gitignore全局配置与忽略匹配规则详解
设置全局配置 1)在C:/Users/用户名/目录下创建.gitignore文件,在里面添加忽略规则。 如何创建 .gitignore 文件? 新建一个.txt文件,重命名(包括后缀.txt)为 .gitignore 即可。 2)将.gitignore设…...
基于 YOLO V10 Fine-Tuning 训练自定义的目标检测模型
一、YOLO V10 在本专栏的前面几篇文章中,我们使用 ultralytics 公司开源发布的 YOLO-V8 模型,分别 Fine-Tuning 实验了 目标检测、关键点检测、分类 任务,实验后发现效果都非常的不错,但它已经不是最强的了。最新的 YOLO-V10 已经…...
Java学习2
1 如果要使用Long类型的变量,在数据值的后面加上L为后缀(可以是大写也可以是小写),例如 Long i9999999L; 2 如果要使用float类型的变量,在数据值的后面加上F为后缀(可以是大写也可以是小写)&a…...
CSS、less、 Sass、
1 CSS 1.1 css中.a.b 与 .a .b(中间有空格)的区别 区别: .a.b是获取同时含有a和b的元素.a .b(中间有空格),是获取.a元素下的所有.b元素<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name=&quo…...
北京大学:利用好不确定性,8B小模型也能超越GPT-4
大模型有一个显著的特点,那就是不确定性——对于特定输入,相同的LLM在不同解码配置下可能生成显著不同的输出。 比如问一问chatgpt“今天开心吗?”,可以得到两种不同的回答。 常用的解码策略有两种,一个是贪婪解码&am…...
哪些云服务商已通过了等保2.0合规性评估?
已通过等保2.0合规性评估的云服务商 根据最新的搜索结果,以下是已通过等保2.0合规性评估的云服务商: 阿里云:阿里云的“电子政务云平台系统”是全国首个通过等保2.0国标测评的云平台,显示了其在云计算领域的安全合规能力。华为云…...
PHP在线加密系统源码
历时半年,它再一次迎来更新[飘过] 刚刚发的那个有点问题,重新修了一下 本次更新内容有点多 1. 更新加密算法(这应该是最后一次更新加密算法了,以后主要更新都在框架功能上面了) 2. 适配php56-php74 3. 取消批量加…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
