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

C的I/O操作

目录

引言

一、文件与目录操作

1. 打开与关闭文件

2. 文件读写操作

3. 文件定位与错误处理

二、字符流与字节流

1. 字符流处理

2. 字节流处理

三、序列化与反序列化

1. 序列化

2. 反序列化

四、新的I/O(NIO)

表格总结

文件与目录操作

字符流与字节流

序列化与反序列化

总结


引言

输入输出(I/O)操作是C语言程序与外部环境交互的重要手段。通过I/O操作,程序可以读取用户输入、访问文件系统以及输出结果到屏幕或文件。本篇文章将详细介绍C语言中的I/O操作,包括文件与目录操作、字符流与字节流、序列化与反序列化及新的I/O(NIO)等内容,帮助读者全面理解和掌握C语言中的I/O操作。

一、文件与目录操作

文件与目录操作是C语言中最常见的I/O操作之一。C语言提供了一组标准库函数,便于程序员对文件和目录进行创建、读写和删除等操作。

1. 打开与关闭文件

在C语言中,使用fopen函数打开文件,使用fclose函数关闭文件。文件可以以不同的模式打开,如读、写、追加等。

示例代码:

#include <stdio.h>int main() {FILE *file;// 以读模式打开文件file = fopen("example.txt", "r");if (file == NULL) {printf("无法打开文件\n");return 1;}// 关闭文件fclose(file);return 0;
}

2. 文件读写操作

C语言中提供了多种文件读写函数,如fscanffprintffgetsfputs等。

示例代码:

#include <stdio.h>int main() {FILE *file;char buffer[100];// 写入文件file = fopen("example.txt", "w");if (file == NULL) {printf("无法打开文件\n");return 1;}fprintf(file, "Hello, world!\n");fclose(file);// 读取文件file = fopen("example.txt", "r");if (file == NULL) {printf("无法打开文件\n");return 1;}fgets(buffer, 100, file);printf("读取到的内容: %s", buffer);fclose(file);return 0;
}

3. 文件定位与错误处理

C语言提供了文件指针定位函数(如fseekftellrewind)及错误处理函数(如ferrorclearerr)。

示例代码:

#include <stdio.h>int main() {FILE *file;long pos;// 以读模式打开文件file = fopen("example.txt", "r");if (file == NULL) {printf("无法打开文件\n");return 1;}// 移动文件指针到文件末尾fseek(file, 0, SEEK_END);// 获取文件指针位置pos = ftell(file);printf("文件大小: %ld 字节\n", pos);// 关闭文件fclose(file);return 0;
}

二、字符流与字节流

字符流和字节流是处理数据流的两种基本方式。字符流处理文本数据,而字节流处理二进制数据。

1. 字符流处理

字符流适用于处理文本文件,通过函数如fgetcfputcfgetsfputs等进行操作。

示例代码:

#include <stdio.h>int main() {FILE *file;char ch;// 以读模式打开文件file = fopen("example.txt", "r");if (file == NULL) {printf("无法打开文件\n");return 1;}// 逐字符读取文件while ((ch = fgetc(file)) != EOF) {putchar(ch);}// 关闭文件fclose(file);return 0;
}

2. 字节流处理

字节流适用于处理二进制文件,通过函数如freadfwrite操作。

示例代码:

#include <stdio.h>int main() {FILE *file;int buffer[5] = {1, 2, 3, 4, 5};// 写入二进制文件file = fopen("data.bin", "wb");if (file == NULL) {printf("无法打开文件\n");return 1;}fwrite(buffer, sizeof(int), 5, file);fclose(file);// 读取二进制文件file = fopen("data.bin", "rb");if (file == NULL) {printf("无法打开文件\n");return 1;}fread(buffer, sizeof(int), 5, file);for (int i = 0; i < 5; i++) {printf("buffer[%d] = %d\n", i, buffer[i]);}fclose(file);return 0;
}

三、序列化与反序列化

序列化是将对象转换为字节流的过程,以便存储或传输数据;反序列化是将字节流转换为对象的过程。C语言通过自定义函数实现序列化和反序列化。

1. 序列化

序列化的目的是将数据结构转换为二进制格式,以便存储到文件或通过网络传输。

示例代码:

#include <stdio.h>typedef struct {int id;char name[50];
} Person;void serialize(Person *person, FILE *file) {fwrite(person, sizeof(Person), 1, file);
}int main() {Person person = {1, "John Doe"};FILE *file = fopen("person.dat", "wb");if (file == NULL) {printf("无法打开文件\n");return 1;}serialize(&person, file);fclose(file);return 0;
}

在上面的示例代码中,我们定义了一个Person结构体,并通过serialize函数将其写入到二进制文件person.dat中。

2. 反序列化

反序列化的目的是将二进制格式的数据转换回原来的数据结构。

示例代码:

#include <stdio.h>typedef struct {int id;char name[50];
} Person;void deserialize(Person *person, FILE *file) {fread(person, sizeof(Person), 1, file);
}int main() {Person person;FILE *file = fopen("person.dat", "rb");if (file == NULL) {printf("无法打开文件\n");return 1;}deserialize(&person, file);fclose(file);printf("ID: %d, Name: %s\n", person.id, person.name);return 0;
}

在上面的示例代码中,我们通过deserialize函数从二进制文件person.dat中读取数据,并将其转换回Person结构体。

四、新的I/O(NIO)

新的I/O(NIO)是一种改进的I/O处理方式,通常通过第三方库实现。NIO提高了数据处理的性能和效率,尤其在大规模数据处理和网络应用中。然而,C语言标准库中不包含NIO实现,但可以借助操作系统提供的系统调用及第三方库(如libuv、Boost.Asio)实现NIO。

表格总结

文件与目录操作

操作函数示例
打开文件fopenfile = fopen("example.txt", "r");
关闭文件fclosefclose(file);
读写文本文件fscanffprintffgetsfputsfscanf(file, "%d", &num);
文件定位fseekftellrewindfseek(file, 0, SEEK_END);

字符流与字节流

类型操作函数示例
字符流读取字符fgetcch = fgetc(file);
字符流写入字符fputcfputc(ch, file);
字符流读取字符串fgetsfgets(buffer, 100, file);
字符流写入字符串fputsfputs(buffer, file);
字节流读取字节freadfread(buffer, size, count, file);
字节流写入字节fwritefwrite(buffer, size, count, file);

序列化与反序列化

操作函数示例
序列化fwritefwrite(person, sizeof(Person), 1, file);
反序列化freadfread(person, sizeof(Person), 1, file);

总结

输入输出(I/O)操作在C语言编程中占据重要地位,包括文件与目录操作、字符流与字节流处理,以及序列化与反序列化。通过深入理解和掌握这些I/O操作,程序员可以实现与外部环境的高效数据交互,为各种应用场景提供稳定可靠的解决方案。无论是文本文件的读写、二进制数据的处理,还是复杂数据结构的序列化和反序列化,这些I/O操作的掌握都对编写高效、健壮的C程序至关重要。

相关文章:

C的I/O操作

目录 引言 一、文件与目录操作 1. 打开与关闭文件 2. 文件读写操作 3. 文件定位与错误处理 二、字符流与字节流 1. 字符流处理 2. 字节流处理 三、序列化与反序列化 1. 序列化 2. 反序列化 四、新的I/O&#xff08;NIO&#xff09; 表格总结 文件与目录操作 字符…...

Android Audio实战——声道信息回调(五)

在前面的 AudioTrack 构造中,我们传入了音频的声道信息,这一节我们就来详细介绍一下声道的配置信息。 一、声道介绍 音频中的声道配置从单声道到双声道(立体声)、再到多声道系统(如5.1和7.1),代表了声音录制和回放技术的发展,旨在提供越来越丰富和沉浸式的听觉体验。 …...

ThreeJS给模型添加介绍文字(贴在模型上 不会一直面向我们)

使用到 FontLoader跟 TextGeometry 引包 import {TextGeometry} from "three/examples/jsm/geometries/TextGeometry"; import {FontLoader} from "three/examples/jsm/loaders/FontLoader";使用 // 创建字体加载器并加载字体 const fontLoader new Fo…...

[Qt] Qt Creator 以及 Qt 在线安装教程

一、Qt Creator 下载及安装 1、从以下镜像源下载安装包常规安装即可 Qt Creator 也可以在第二步Qt 在线安装时一次性勾选安装&#xff0c;见后文 Qt Creator 中科大源下载地址 二、Qt 在线安装 1、根据所在平台选择对应的安装器下载 Qt 在线安装器下载 2、可能的安装报错…...

【大分享05】动态容差归档,打通不动产登记管理“最后一公里”

关注我们 - 数字罗塞塔计划 - 本篇是参加由电子文件管理推进联盟联合数字罗塞塔计划发起的“大分享”活动投稿文章&#xff0c;来自上海涵妍档案信息技术有限责任公司&#xff0c;作者&#xff1a;陈雪。 一、政策背景 在“互联网政务服务”的浪潮下&#xff0c;各级政府机构…...

嵌入式模拟电路面试题大全及参考答案(持续更新)

目录 理想运算放大器的两个基本特性 共模抑制比(CMRR)及其重要性 负反馈在放大器中的作用 差分放大电路的工作原理 使用运算放大器构建非反相放大器 电源抑制比(PSRR) 带宽(BW)在放大器中的含义 计算RC低通滤波器的截止频率 基本的积分电路及其时间常数 增益-带…...

【C语言】解决C语言报错:Uninitialized Variable

文章目录 简介什么是Uninitialized VariableUninitialized Variable的常见原因如何检测和调试Uninitialized Variable解决Uninitialized Variable的最佳实践详细实例解析示例1&#xff1a;局部变量未初始化示例2&#xff1a;数组未初始化示例3&#xff1a;指针未初始化示例4&am…...

RabbitMQ实践——交换器(Exchange)绑定交换器

在《RabbitMQ实践——交换器&#xff08;Exchange&#xff09;和绑定&#xff08;Banding&#xff09;》一文中&#xff0c;我们实验了各种交换器。我们可以把交换器看成消息发布的入口&#xff0c;而消息路由规则则是由“绑定关系”&#xff08;Banding&#xff09;来定义&…...

使用 Vue 官方脚手架初始化 Vue3 项目

Vite 官网&#xff1a;https://cn.vitejs.dev/ Vue 官网&#xff1a;https://vuejs.org/ Vue 官方文档&#xff1a;https://cn.vuejs.org/guide/introduction.html Element Plus 官网&#xff1a;https://element-plus.org/ Tailwind CSS 官网&#xff1a;https://tailwindcss.…...

C语言中的宏定义(#define)和函数调用的区别

C语言中的宏定义&#xff08;#define&#xff09;和函数调用在概念、工作方式以及它们对代码的影响上有显著的区别。以下是它们之间的主要差异&#xff1a; 宏定义&#xff08;#define&#xff09; 工作方式&#xff1a;宏定义是在预处理阶段进行的文本替换。预处理器会在编译…...

196. 删除重复的电子邮箱

196. 删除重复的电子邮箱 题目链接&#xff1a;196. 删除重复的电子邮箱 代码如下&#xff1a; # Write your MySQL query statement below delete from Person as p where p.id not in(select e.id from (select min(id) as idfrom Person group by email ) as e )...

Android 大话binder通信 (上)

戳蓝字“牛晓伟”关注我哦&#xff01; 用心坚持输出易读、有趣、有深度、高质量、体系化的技术文章 本文摘要 用故事的方式把binder通信的整个过程都描述出来&#xff0c;binder通信都经历了哪些节点&#xff0c;在这些节点上的数据有哪些变化&#xff0c;同时还对binder通…...

DevOps学习回顾01-技能发展路线-岗位能力-体系认知

事为先&#xff0c;人为重–事在人为 参考来源&#xff1a; 极客时间专栏&#xff1a;DevOps实战笔记&#xff0c;作者&#xff1a;石雪峰 课程链接&#xff1a;https://time.geekbang.org/column/intro/235 时代的典型特征 VUCA VUCA 是指易变性&#xff08;Volatility&…...

【MySQL】复合查询和内外连接

文章目录 MySQL复合查询和内外连接1. 复合查询1.1 多表查询1.2 自连接1.3 子查询单行子查询多行子查询多列子查询from中使用子查询合并查询 2. 内外连接1. INNER JOIN2. LEFT JOIN3. RIGHT JOIN4. FULL JOIN5. CROSS JOIN MySQL复合查询和内外连接 1. 复合查询 1.1 多表查询 …...

【星海随笔】云解决方案学习日志篇(二) kafka、Zookeeper、Fielbeat

Elastic 中国社区官方博客 https://blog.csdn.net/ubuntutouch/category_9209092.html Kafka kafka的源代码是基于Scala语言编写的&#xff0c;运行在Java虚拟机&#xff08;即:JVM&#xff09;上。因此&#xff0c;在安装kafka之前需要先安装JDK Kafka 为什么依赖 Zookeepe…...

【测试专题】系统测试报告(原件Word)

软件测试报告在软件开发过程中起着至关重要的作用&#xff0c;主要有以下几个主要原因&#xff1a; 1、确保软件质量 2、提供决策支持 3、记录测试过程和结果 4、促进沟通和协作 5、符合标准和法规要求 6、改进测试流程和策略 7、降低风险 软件开发全套资料获取进主页或者本文末…...

C++中的模板方法模式

目录 模板方法模式&#xff08;Template Method Pattern&#xff09; 实际应用 数据处理流程 在线教育系统的课程模板 软件开发生命周期 总结 模板方法模式&#xff08;Template Method Pattern&#xff09; 模板方法模式是一种行为设计模式&#xff0c;它定义了一个操作…...

【数据结构】第十七弹---C语言实现选择排序

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、选择排序 1.1、基本思想 1.2、代码实现 1.3、代码测试 1.4、时空复杂度分析 总结 1、选择排序 1.1、基本思想 选择排序是一种简单直观的比…...

信号处理中的梯型权重操作(Tapering)

目录 1. 引言2. 一个Tapering操作的例子3. Tapering操作的简单实现延伸阅读1. 引言 Tapering 操作是对信号数据在水平和垂直方向上应用梯形权重,这个操作可以减弱数据边界效应,从而在进行傅里叶变换时减少伪影和边缘效应。本文将通过一个简单的例子来展示 Tapering 操作的具…...

深入解析分布式链路追踪:原理、技术及应用

目录 分布式链路追踪简介分布式链路追踪的基本概念 Span 和 Trace上下文传播采样策略 分布式链路追踪的工作原理常见的分布式链路追踪系统 ZipkinJaegerOpenTelemetry 分布式链路追踪的技术实现 数据收集数据传输数据存储数据展示 分布式链路追踪的应用场景 性能优化故障排除依…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...