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程序至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/715998.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nuxt3+vue3+vite+TS实现国际化

前言 博主最近打算用Nuxt3重构了自己SSR博客&#xff0c;打算添加国际化功能&#xff0c;众所周知&#xff0c;实现国际化已是一个很常见的功能。用户可以根据自己的喜好&#xff0c;设置页面的自己合适的语言&#xff0c;从而实现国际化浏览。这样用户体验度会大大提升。博客…

使用Midjourney为产品创建出色效果图-关键词

使用MJ为产品创建效果图并不难&#xff0c;可以使用这个固定提示词公式。 Mockup empty, blank [ product ], [ decorating items ] [ background or context ], [ 1- 3 descriptive style], [ color palette ] 创建产品形象 首先&#xff0c;你需要准备一个透明背景的产品。…

Python中文自然语言处理(NLP)中文分词工具库之pkuseg使用详解

概要 在中文自然语言处理(NLP)中,分词是一个基础且关键的任务。pkuseg 是由北京大学开发的一个中文分词工具,专为处理现代汉语而设计。它采用了先进的深度学习技术,能够准确地进行中文分词,同时支持自定义词典和多领域分词。本文将详细介绍 pkuseg 库,包括其安装方法、…

动态 SQL

动态 SQL 是 MyBatis 的强大特性之一&#xff0c;能够完成不同条件下不同的 sql 拼接。也就是说执行的 SQL 语句并不是固定的&#xff0c;而是不同人的不同操作执行的语句会有所差异。MyBatis 通过使用 标签 的方式来实现这种灵活性的。 <if>标签 例如在有一些网站进行…

一些个人电脑用的小工具软件

1 个人电脑信息管理 如下&#xff1b; 整理自己的电脑信息&#xff1b;录入&#xff0c;保存&#xff0c;查询&#xff1b;添加和更新界面如下&#xff0c; 每次添加、更新之后重新点一下菜单的浏览&#xff1b; 下载&#xff0c; https://download.csdn.net/download/bcb…

如何使用 pip 卸载所有已安装的 Python 包?

在开发过程中&#xff0c;我们可能会安装许多 Python 包&#xff0c;有时需要彻底清理环境&#xff0c;以便从头开始或者解决冲突问题。下面将介绍如何使用 pip 命令卸载所有已安装的 Python 包。 一、列出所有已安装的包 首先&#xff0c;需要列出当前环境中所有已安装的包。…

Vue49-props属性

一、当同一个组件标签被使用多次 因为data属性写的是函数形式&#xff01; 二、需求&#xff1a;老王也想用<Student>组件&#xff0c;但是需要动态把老王想要的值传进来。 2-1、使用props属性接收参数 使用props属性&#xff0c;接收的这三个参数&#xff0c;是被保存在…

入门机器视觉的正确打开方式——徒手撸一个python+opencv实现的机器视觉简易调试工具(上)

目录 1.引言2.框架思路3.环境搭建4.图像处理流程化的实现5.流水线上的算法块5.1 算法块的可视化 6.总结7.调试工具成品链接PS.扩展阅读ps1.六自由度机器人相关文章资源ps2.四轴机器相关文章资源ps3.移动小车相关文章资源 1.引言 在当今AI时代&#xff0c;关于视觉识别似乎已被…

位运算算法:编程世界中的魔法符号

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一. 常见位运算总结 二、常见位运算题目 2.1 位1的个数 2.2 比特数记位&#xff08;典型dp&#xff09; 2.3 汉明距离 2.4 只出现一次的数字&#xff08;1&#xff09; 2.5 只出…

QtScrcpy最出色的C++开源手机投屏控制软件

QtScrcpy是一款开源的跨平台屏幕录制和投屏工具 基本概述&#xff1a; 它基于Android的ADB&#xff08;Android Debug Bridge&#xff09;和Electron框架&#xff0c;为用户提供了简洁且功能强大的用户界面。 支持平台&#xff1a; QtScrcpy支持Windows、macOS和Linux三大…

算力与能源正在成为世界的硬通货,看超级计算机安腾如何突围

特斯拉创始人马斯克公开表态称未来两年人工智能行业将由“缺硅”变为“缺电”。据媒体报道&#xff0c;OpenAI的ChatGPT每天消耗超过50万千瓦时的电力&#xff0c;用于处理约2亿个用户请求&#xff0c;相当于美国家庭每天用电量的1.7万多倍。除了这类生成式AI耗能外&#xff0c…

【Linux】使用 iptables 验证访问HDFS 所使用到的端口

目录 ​编辑 一、实操背景 二、iptables 简介 三、模拟操作 一、实操背景 背景&#xff1a; 在客户有外网的服务器需要访问内网大数据集群HDFS&#xff0c;使用iptable模拟测试需要开放的端口。 二、iptables 简介 具体介绍看文章&#xff1a; 【Linux】Iptables 详解与实战…

Elasticsearch出现Connection reset by peer

Elasticsearch出现Connection reset by peer分析 1.异常&#xff1a; 2024-06-13 13:17:10.539 WARN [http-nio-30411-exec-9]com.longdaotech.config.ESConfig -onFailure node:[hosthttp://192.168.239.253:9200] 2024/6/13 13:17:10 2024-06-13 13:17:10.541 WARN [http-n…

aop注解快速实现数据脱敏返回

说明&#xff1a; 公司之前数据接口数据管理不严格&#xff0c;很多接口的敏感数据都没有脱敏处理&#xff0c;直接返回给前端了&#xff0c;然后被甲方的第三方安全漏洞扫出来&#xff0c;老板要求紧急处理&#xff0c;常用的话在单个字段上加上脱敏注解会更加的灵活&#xf…

Win11升级24H2出现绿屏怎么办?这些方法帮你解决!

在Win11电脑操作中&#xff0c;用户为了体验24H2版本推出的新功能&#xff0c;所以要把系统版本升级为24H2版本。但升级过程中电脑却出现了绿屏问题&#xff0c;不清楚要怎么操作才能解决绿屏的问题&#xff1f;接下来小编给大家分享几种简单有效的解决方法&#xff0c;让大家能…

轨迹优化 | 图解欧氏距离场与梯度场算法(附ROS C++/Python实现)

目录 0 专栏介绍1 什么是距离场&#xff1f;2 欧氏距离场计算原理3 双线性插值与欧式梯度场4 仿真实现4.1 ROS C实现4.2 Python实现 0 专栏介绍 &#x1f525;课程设计、毕业设计、创新竞赛、学术研究必备&#xff01;本专栏涉及更高阶的运动规划算法实战&#xff1a;曲线生成…

基于Java和SSM框架的多人命题系统

你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果你对多人命题系统感兴趣或者有相关开发需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java SSM框架 工具&#xff1a;Eclipse、MySQL Workbench、…

大众点评_token,mtgsig

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未经许可禁止转载&#xff0…

springboot“漫画之家”系统 LW+PPT+源码

3 系统分析 链接&#xff1a;https://pan.baidu.com/s/1ihILTui-XEFdC15mcOB0vA?pwdewry 提取码&#xff1a;ewry 3.1系统可行性分析 3.1.1经济可行性 由于本系统是作为毕业设计系统&#xff0c;且系统本身存在一些技术层面的缺陷&#xff0c;并不能直接用于商业用途&#xf…