C的I/O操作

news2024/11/24 14:08:02

目录

引言

一、文件与目录操作

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

证明 均匀分布 的期望和方差

均匀分布 均匀分布&#xff08;Uniform Distribution&#xff09;是一种常见的连续型概率分布&#xff0c;其中随机变量在给定区间内的每个值都有相同的概率。假设随机变量 ( X ) 在区间 ([a, b]) 上服从均匀分布&#xff0c;记作 均匀分布的概率密度函数&#xff08;PDF&am…

好用的库函数,qsort函数大详解(干货满满!)(进阶)

前言&#xff1a; 小编在上一篇文章说了这一篇将要写qsort函数的模拟实现&#xff0c;那么废话不多说&#xff0c;现在开始进入今天的代码之旅喽&#xff01; 目录&#xff1a; 1.qsort函数的模拟实现的逻辑和思路 2.qsort函数模拟实现的代码实现 3.代码展示 1.qsort函数的模…

YOLOv9独家提点|加入MobileViT 、SK 、Double Attention Networks、CoTAttention等几十种注意力机制(五)

本文介绍了YOLOv9模型的改进,包括加入多种注意力机制,如SE、CBAM、ECA和SimAM。此外,还探讨了MobileViT轻量级视觉Transformer在移动设备上的应用,以及SelectiveKernelNetworks和A2-Nets的双注意力结构。最后,CoTAttention网络在视觉问答任务中的改进展示了跨模态注意力交…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 6月17日,星期一

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年6月17日 星期一 农历五月十二 1、 今年首个红色山洪灾害预警&#xff1a;17日&#xff0c;浙江西南部、福建北部局地发生山洪灾害可能性很大。 2、 国家医疗保障局重构产科服务价格项目&#xff0c;“分娩镇痛”亲情陪产…

AI大模型在运动项目的深度融合和在穿戴设备的实践及未来运动健康技术发展

文章目录 1. 技术架构2. 模型选择2.1 LSTM&#xff08;长短期记忆网络&#xff09;2.2 CNN&#xff08;卷积神经网络&#xff09;2.3 Transformer 3. 数据处理数据预处理 4. 实时性要求4.1 边缘计算4.2 模型优化 5. 数据隐私与安全6. 深入分析AI大模型在穿戴设备的应用和未来发…

Yum安装LAMP

查看当前80端口是否被占用 ss -tulanp | grep 80查询httpd是否在yum源中 yum info httpd安装httpd yum -y install httpd启动httpd服务&#xff0c;设置开机自启 systemctl enable httpd --now systemctl start httpd查看当前进程 ps aux | grep httpd查看当前IP&#xff…

Google谈出海:品牌「性价比」转向「心价比」

Google Marketing Live中国站活动现场 越来越多的中国全球化品牌基于对全球消费和海外地区的深刻洞察&#xff0c;不断提升产品研发和迭代能力&#xff0c;在海外消费者心中塑造「中国质造」和「中国智造」的新形象。2023年6月15日&#xff0c;凯度与Google合作发布《2023 凯…

AI数据分析:根据Excel表格数据进行时间序列分析

ChatGPT中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个Python脚本编写的任务&#xff0c;具体步骤如下&#xff1a; 读取Excel表格&#xff1a;"F:\AI自媒体内容\AI行业数据分析\toolify月榜\toolify2023年-2024年月排行榜汇总数据.xlsx"…

vite-plugin-pwa 离线安装Vite应用

渐进式Web应用&#xff08;PWA&#xff09;通过结合 Web 和移动应用的特点&#xff0c;为用户带来更加流畅和快速的体验。且PWA支持离线访问能力&#xff08;访问静态资源本地缓存&#xff09;&#xff0c;极大提高了用户交互的流畅性&#xff0c;降低非必要的网络依赖。尤其适…

基于 U-Net 的图像分割

点击下方卡片&#xff0c;关注“小白玩转Python”公众号 图像分割是一种将图像划分为不同区域或对象的过程。它通常在像素级别进行&#xff0c;通过将图像中具有相似特征的区域分组或定义对象的边界来完成。这是一种识别和解析图像中不同对象或特征的方法。 假设一位医学专业人…

气象数据NC、grb2解析成矢量json、CMIS、MICPS及图片应用到webgis

一、基础概念 气象数据通常以多种格式存储和交换&#xff0c;以适应不同的应用需求和处理工具。以下是一些常见的气象数据格式及其转换方法的概述&#xff1a; 常见气象数据格式 1. NetCDF&#xff08;Network Common Data Form&#xff09;&#xff1a;一种自描述、自包含的…

SD卡、MicroSD卡与SD NAND的全面对比分析

在当今多样化的存储设备市场中&#xff0c;SD卡、MicroSD卡和SD NAND因其不同的特性和应用场景而广受欢迎。这三种存储解决方案各有千秋&#xff0c;为消费者提供了丰富的选择。以下是MK米客方德SD卡、MicroSD卡和SD NAND全面的对比分析&#xff1a;

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

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

英伟达发布开源模型Nemotron-4 340B

&#x1f680; 英伟达发布开源模型Nemotron-4 340B 摘要&#xff1a;英伟达最新发布的开源模型Nemotron-4 340B&#xff0c;可能彻底改变大语言模型&#xff08;LLM&#xff09;训练方式。该模型支持多种自然语言和编程语言&#xff0c;使用9万亿个token训练&#xff0c;高达9…

python数据分析-心脏瓣膜手术风险分析与预测

一、研究背景和意义 人的心脏有四个瓣膜&#xff0c;主动脉银、二尖、肺动脉和三尖源 不管是那一个膜发生了病变&#xff0c;都会导致心脏内的血流受到影响&#xff0c;这就是通常所说的心脏期膜病&#xff0c;很多是需要通过手术的方式进行改善的。随着人口老龄化的加剧,&…

Aeron:Multi-Destination-Cast

Multi-Destination-Cast&#xff08;MDC&#xff09;是一种功能&#xff0c;允许 Aeron 从单个 Publication 同时向多个目的地传送数据。Multiple-Destination-Cast是 Aeron 的一项高级功能&#xff0c;本指南将介绍如何开发一个简单示例的基本知识。 一、MDC Publications 注&…

机器学习中的监督学习介绍

In this post well go into the concept of supervised learning, the requirements for machines to learn, and the process of learning and enhancing prediction accuracy. 在这篇文章中&#xff0c;我们将深入探讨监督学习的概念、机器学习的要求以及学习和提高预测准确…

Proxmox VE (PVE) 教学 (3) | 在 Proxmox VE 中安装与配置 OpenWrt

大家好,很长时间没有更新这个系列了。最近正在开发新项目,刚刚想起来我是不是还有一个什么专栏没更新。 本期的网络配置背景同于前两期的描述( 详见https://www.hestudio.net/category/proxmox-ve/ ),这一期只是对网络配置的扩展,也就是安装软路由,实现网络配置的更多功…

计算机网络:1概述

概述 因特网 网络、互连网&#xff08;互联网&#xff09;与因特网的区别与关系 若干节点和链路互连形成网络&#xff0c;若干网络通过路由器互连形成互连网&#xff0c;世界上最大的互连网是互联网&#xff08;因特网Internet&#xff09;。 因特网发展的三个阶段 因特网…

【挑战100天首通《谷粒商城》】-【第一天】【10 番外篇】 解决docker 仓库无法访问 + MobaXterm连接VirtualBox虚拟机

文章目录 课程介绍 1、解决docker 仓库无法访问 2、 MobaXterm连接VirtualBox虚拟机 Stage 1&#xff1a;下载MobaXterm选择适合你的版本 Stage 2&#xff1a;vagrant ssh 连接&#xff0c;开启ssh访问 Stage 2-1&#xff1a;su获取root账号权限,输入密码&#xff08;默认vagra…