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

二进制写入与文本写入的本质区别:系统视角下的文件操作

目录

一、核心概念

二、二进制写入

1、特点

2、使用场景

3、二进制写入整数 12345 的详细解析示例

1. 变量声明与初始化

2. 文件打开

3. 二进制写入

4. 文件关闭

二进制表示分析

文件内容

重要注意事项

三、文本写入

1、特点

2、使用场景

3、文本模式写入整数的详细解析示例

1. 变量声明与初始化

2. 文件打开

3. 文本格式化写入

4. 文件关闭

文件内容分析

与二进制写入的关键区别

四、更直观的例子和对比

1. 直观比喻

2. 经典例子对比

文本写入(用 "w" 模式)

二进制写入(用 "wb" 模式)

五、系统视角:它真的不关心

六、关键区别总结

七、选择建议


一、核心概念

        二进制写入和文本写入是两种不同的文件操作方式,但关键点在于:系统本身并不关心你使用的是哪种方式。系统只处理字节流,所有的解释工作都由应用程序完成。


二、二进制写入

1、特点

  • 将数据按内存中的原始形式直接写入文件

  • 不进行任何转换或格式化

  • 保持数据的精确二进制表示

2、使用场景

  • 存储结构化数据(如数据库文件)

  • 保存程序状态(如游戏存档)

  • 传输原始数据(如图像、音频文件)

  • 需要精确控制数据布局的情况

3、二进制写入整数 12345 的详细解析示例

int num = 12345;
FILE *file = fopen("data.bin", "wb");
fwrite(&num, sizeof(int), 1, file);
fclose(file);

这段代码展示了如何使用C语言将整数以二进制形式写入文件。让我们逐步分析:

1. 变量声明与初始化

int num = 12345;
  • 声明一个整型变量 num 并初始化为 12345

  • 在大多数现代系统上,int 通常占4字节(32位)

2. 文件打开

FILE *file = fopen("data.bin", "wb");
  • fopen 打开名为 "data.bin" 的文件

  • 模式字符串 "wb" 表示:

    • w - 写入模式(如果文件存在则清空,不存在则创建)

    • b - 二进制模式(不进行任何文本转换)

  • 返回 FILE* 指针用于后续文件操作

3. 二进制写入

fwrite(&num, sizeof(int), 1, file);
  • fwrite 函数参数解析:

    1. &num - 要写入数据的内存地址(指向num的指针)

    2. sizeof(int) - 每个元素的大小(这里是int的大小,通常4字节)

    3. 1 - 要写入的元素数量(这里只写1个整数)

    4. file - 目标文件指针

  • 实际操作:将 num 变量的内存表示直接写入文件,不进行任何转换

4. 文件关闭

fclose(file);
  • 关闭文件并释放资源

  • 确保所有缓冲数据实际写入磁盘

二进制表示分析

对于 int num = 12345:

  • 十六进制表示:0x00003039

  • 小端序(Little-endian)系统中的实际字节序列(低字节在前):39 30 00 00

  • 大端序(Big-endian)系统中的字节序列:00 00 30 39

文件内容

在小端序系统(x86架构等)上,生成的文件 "data.bin" 将包含4个字节:39 30 00 00

重要注意事项

  1. 字节序问题

    • 二进制写入的字节顺序取决于CPU架构

    • 在不同字节序的系统间传输二进制数据时需要考虑这一点

  2. 可移植性问题

    • int 的大小可能因平台而异(通常是4字节,但不保证)

    • 对于跨平台数据交换,最好使用固定大小的类型如 int32_t

  3. 文本vs二进制

    • 如果用文本模式写入,会写入字符'1','2','3','4','5'的ASCII码(5字节)

    • 二进制模式直接存储数字的内部表示(通常4字节)

  4. 数据对齐

    • 二进制写入保持原始内存对齐

    • 在某些系统上可能影响读取性能


三、文本写入

1、特点

  • 将数据转换为人类可读的字符序列

  • 可能涉及编码转换(如Unicode)

  • 通常以行分隔符(如\n)组织数据

2、使用场景

  • 配置文件

  • 日志文件

  • 需要人工阅读或编辑的文件

  • 与其他文本处理工具交互

3、文本模式写入整数的详细解析示例

int num = 12345;
FILE *file = fopen("data.txt", "w");
fprintf(file, "%d", num);
fclose(file);

1. 变量声明与初始化

int num = 12345;
  • 声明一个整型变量 num 并初始化为 12345

  • int 类型通常占4字节(32位),存储的是二进制值

2. 文件打开

FILE *file = fopen("data.txt", "w");
  • fopen 打开名为 "data.txt" 的文件

  • 模式字符串 "w" 表示:

    • 写入模式(如果文件存在则清空,不存在则创建)

    • 默认是文本模式(不需要显式指定"t")

  • 返回 FILE* 指针用于后续文件操作

3. 文本格式化写入

fprintf(file, "%d", num);
  • fprintf 函数参数解析:

    1. file - 目标文件指针

    2. "%d" - 格式说明符,表示将整数转换为十进制表示

    3. num - 要写入的整数值

  • 实际操作:

    1. 将整数 12345 转换为字符串"12345"(5个ASCII字符)

    2. 将这些字符写入文件

4. 文件关闭

fclose(file);
  • 关闭文件并释放资源

  • 确保所有缓冲数据实际写入磁盘

文件内容分析

生成的文件 "data.txt" 将包含以下内容:1 2 3 4 5

对应的ASCII码值:31 32 33 34 35(十六进制表示)

与二进制写入的关键区别

  1. 存储形式

    • 文本:存储的是数字的字符表示(ASCII码)

    • 二进制:存储的是数字的原始二进制形式

  2. 文件大小:

    • 文本:每个数字字符占1字节,12345占用5字节

    • 二进制:通常占用4字节(取决于int大小)

  3. 可读性:

    • 文本:用文本编辑器可直接查看内容

    • 二进制:需要特殊工具才能正确解读

  4. 处理过程:

    • 文本:涉及数字到字符串的转换

    • 二进制:直接内存拷贝,无转换


四、更直观的例子和对比

1. 直观比喻

  • 文本写入:像用笔在纸上写字(人类可读,但可能丢失细节)
    → 存储"123"时,实际存的是字符 '1''2''3' 的ASCII码

  • 二进制写入:像用复印机直接复印一张纸(保留所有原始信息)
    → 存储数字 123 时,直接存它在内存中的二进制形式

2. 经典例子对比

假设我们要存储数字 12345 和字符串 "Hello"

文本写入(用 "w" 模式)

FILE *file = fopen("text.txt", "w");
fprintf(file, "%d %s", 12345, "Hello");  // 写入文本
fclose(file);

生成的文件内容(用十六进制查看):

31 32 33 34 35 20 48 65 6C 6C 6F  # ASCII码对应 "12345 Hello"
  • 特点

    • 数字 12345 被转换成5个字符 '1' '2' '3' '4' '5'(每个占1字节)

    • 空格是ASCII码 0x20

    • "Hello" 被拆分成5个ASCII字符

二进制写入(用 "wb" 模式)

FILE *file = fopen("binary.bin", "wb");
int num = 12345;
char str[] = "Hello";
fwrite(&num, sizeof(int), 1, file);  // 直接写二进制
fwrite(str, sizeof(char), sizeof(str), file); // 包括字符串结尾的\0
fclose(file);

生成的文件内容(假设是小端序系统):

39 30 00 00 48 65 6C 6C 6F 00  # 前4字节是12345的二进制,后6字节是"Hello\0"
  • 特点

    • 数字 12345 直接以4字节二进制存储(十六进制 0x00003039,小端序显示为 39 30 00 00

    • 字符串 "Hello" 连带结束符 \0(ASCII码 0x00)一起写入


五、系统视角:它真的不关心

  1. 底层机制相同:无论是二进制还是文本模式,系统都只是将字节序列写入存储设备

  2. 差异来自运行时库

    • 文本模式可能处理换行符转换(如Windows中的\r\n与Unix的\n

    • 文本模式可能涉及字符编码转换

  3. 文件就是字节:在操作系统看来,所有文件都只是字节序列,所谓的"二进制"和"文本"区别是应用程序层面的概念


六、关键区别总结

特性二进制写入文本写入
数据表示原始内存形式格式化字符表示
精度精确,无损失可能损失精度(如浮点数)
可读性不可直接阅读人类可读
大小通常更紧凑通常更大
处理开销较高(需要转换)
跨平台一致性高(但需注意字节序)可能因编码/换行符而异

七、选择建议

  • 需要精确数据表示高效存储 → 二进制

  • 需要人工编辑与其他文本工具交互 → 文本

  • 记住:系统只处理字节,所有解释都由你的程序负责

        最终,选择哪种方式取决于你的具体需求,而不是系统的限制,因为系统确实不关心你使用哪种方式。

http://www.xdnf.cn/news/15623.html

相关文章:

  • IT 和OT指的什么?
  • LangChain 源码剖析(七)RunnableBindingBase 深度剖析:给 Runnable“穿衣服“ 的装饰器架构
  • 基于现代R语言【Tidyverse、Tidymodel】的机器学习方法
  • KuiperInfer第八课-实现resnet推理
  • 在ComfyUI中CLIP Text Encode (Prompt)和CLIPTextEncodeFlux的区别
  • git是啥
  • Selenium自动化浏览器操作指南
  • 5 种可行的方法:如何将 Redmi 联系人备份到 Mac
  • 智能Agent场景实战指南 Day 16:Agent记忆系统设计
  • 微流控工程普鲁士蓝水凝胶微球用于增强骨关节炎抗氧化效应
  • PyTorch新手实操 安装
  • 如何区别HTML和HTML5?
  • 【移动端知识】移动端多 WebView 互访方案:Android、iOS 与鸿蒙实现
  • 格式转换Total Excel Converter:20 种格式XLS XLSX 批量转 PDFWord
  • SpringMVC + Tomcat10
  • 链路聚合技术
  • 时序数据库 Apache IoTDB 实战:基于 Kubernetes 的部署运维全指南
  • 抗辐照与国产替代:ASM1042在卫星光纤放大器(EDFA)中的应用探索
  • 新手向:图片批量裁剪工具
  • Jfinal+SQLite解决MYSQL迁移表未复制索引问题,完善迁移工具
  • AI问答-供应链管理:各种交通运输方式货运成本分析
  • 20.轮廓特征与近似,改变图像的轮廓识别画线的精确度,同时画出轮廓对应的矩形
  • 下载了docker但是VirtualBox突然启动不了了
  • Redis:哨兵(Sentinel)
  • Jmeter使用 -1
  • EPLAN 电气制图(十): 绘制继电器控制回路从符号到属性设置(上)
  • python学智能算法(二十二)|SVM-点与超平面的距离
  • 征程 6 UCP 任务优先级 抢占简介与实操
  • 1. 【面试题】- 盒马鲜生(上)
  • 【通识】网络的基础知识