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. 取消批量加…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...