株洲做网站优化/百度灰色关键词排名技术
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. 取消批量加…...

OpenCV学习笔记 比较基于RANSAC、最小二乘算法的拟合
一、RANSAC算法 https://skydance.blog.csdn.net/article/details/134887458https://skydance.blog.csdn.net/article/details/134887458 二、最小二乘算法 https://skydance.blog.csdn.net/article/details/115413982...

前端JS特效第53集:带声音的烟花模拟绽放特效插件
带声音的烟花模拟绽放特效插件,先来看看效果: 部分核心的代码如下(全部代码在文章末尾): <!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>Firework Simulator v2&…...

好展位,抢先订!2025浙江(玉环)机械展
2025第18届浙江(玉环)机械工业展览会 时间地点:2025年4月25-28日 玉环会展中心 近年来,随着玉环工业经济的蓬勃发展,汽摩配件、阀门水暖五金产业、铜加工、眼镜配件、金属加工生产等行业,如同贪婪的巨人&…...

Java面试八股之Spring如何解决循环依赖
Spring如何解决循环依赖 在Spring框架中,循环依赖问题通常发生在两个或多个Bean相互依赖的情况下。Spring为了解决循环依赖问题,采用了不同的策略,这些策略主要取决于Bean的作用域以及依赖注入的方式。下面是一些关键点: 单例Be…...

如何为 SQL Server 设置强密码以增强安全性?
为 SQL Server 设置强密码是增强数据库安全性的重要步骤。以下是一些关键步骤和最佳实践: 1. 使用复杂密码 长度:密码应至少为 12 个字符。字符类型:包括大写字母、小写字母、数字和特殊字符(如 !#$%^&*())。避免…...

C语言实现三子棋
通过一段时间的学习,我们已经能够较为熟练地使用分支语句,循环语句,创建函数,创建数组,创建随机数等。之前我们做过一个扫雷游戏,今天让我们再尝试创作一个三子棋游戏吧~ 一、三子棋游戏的思路 三子棋的游…...

昇思25天学习打卡营第XX天|RNN实现情感分类
希望代码能维持开源维护状态hhh,要是再文件整理下就更好了,现在好乱,不能好fork tutorials/application/source_zh_cn/nlp/sentiment_analysis.ipynb MindSpore/docs - Gitee.com...

linux深度学习环境配置(cuda,pytorch)
显卡驱动 首先查看linux服务器是否存在显卡驱动,可以输入以下命令 nvidia-smi如果没有直接显示下面的画面 则进行下面的步骤: ubuntu-drivers devices sudo ubuntu-drivers autoinstall上述步骤的意思是直接在线安装 然后重启linux服务器 reboot发现…...

SpringBoot教程(十九) | SpringBoot集成Slf4j日志门面
SpringBoot教程(十九) | SpringBoot集成Slf4j日志门面 一、概述二、前言三、引入依赖 (不需要额外引入了)四、自定义Logback的配置文件(一般都需配置)情况一:不配置任何关于logback的配置文件情况二:配置关…...

科普文:深入理解ElasticSearch体系结构
概叙 Elasticsearch是什么? Elasticsearch(简称ES)是一个分布式、可扩展、实时的搜索与数据分析引擎。ES不仅仅只是全文搜索,还支持结构化搜索、数据分析、复杂的语言处理、地理位置和对象间关联关系等。 官网地址:…...