【重新认识C语言----文件管理篇】

目录

​编辑

-----------------------------------------begin-------------------------------------

引言

1. 文件的基本概念

2. 文件指针

3. 文件的打开与关闭

3.1 打开文件

3.2 关闭文件

4. 文件的读写操作

4.1 读取文件

4.1.1 使用fgetc()读取文件

4.1.2 使用fgets()读取文件

4.1.3 使用fread()读取文件

4.2 写入文件

4.2.1 使用fputc()写入文件

4.2.2 使用fputs()写入文件

4.2.3 使用fwrite()写入文件

5. 文件的定位操作

5.1 使用fseek()定位文件指针

5.2 使用ftell()获取文件指针位置

5.3 使用rewind()重置文件指针

6. 文件的错误处理

6.1 使用feof()检查文件末尾

6.2 使用ferror()检查文件错误

7. 文件的删除与重命名

7.1 使用remove()删除文件

7.2 使用rename()重命名文件

8. 综合示例

结语

路过的佬们点点关注哦~

你们的鼓励是我前进的动力~

-------------------------------------------end-------------------------------------


-----------------------------------------begin-------------------------------------

引言

在C语言编程中,文件操作是一个非常重要的部分。无论是读取配置文件、保存数据,还是处理日志文件,文件操作都是不可或缺的。C语言提供了一套丰富的库函数来进行文件的创建、打开、读取、写入和关闭等操作。本文将详细介绍C语言中的文件操作,帮助读者深入理解并掌握这些操作。

1. 文件的基本概念

在C语言中,文件是存储在外部存储器(如硬盘、U盘等)上的数据集合。文件可以分为文本文件和二进制文件两种类型:

  • 文本文件:以字符形式存储数据,每个字符占用一个字节,通常用于存储可读的文本信息。

  • 二进制文件:以二进制形式存储数据,通常用于存储非文本数据,如图片、音频、视频等。

2. 文件指针

在C语言中,文件操作是通过文件指针来进行的。文件指针是一个指向FILE结构体的指针,FILE结构体包含了文件的相关信息,如文件的位置、缓冲区状态等。常用的文件指针类型是FILE*

FILE *fp;

3. 文件的打开与关闭

3.1 打开文件

在C语言中,使用fopen()函数来打开文件。fopen()函数的原型如下:

FILE *fopen(const char *filename, const char *mode);
  • filename:要打开的文件名。

  • mode:打开文件的模式,常见的模式有:

    • "r":只读模式,文件必须存在。

    • "w":只写模式,如果文件存在则清空文件内容,如果文件不存在则创建文件。

    • "a":追加模式,如果文件存在则在文件末尾追加内容,如果文件不存在则创建文件。

    • "r+":读写模式,文件必须存在。

    • "w+":读写模式,如果文件存在则清空文件内容,如果文件不存在则创建文件。

    • "a+":读写模式,如果文件存在则在文件末尾追加内容,如果文件不存在则创建文件。

    • "b":以二进制模式打开文件(可以与上述模式组合使用,如"rb""wb"等)。

示例:

FILE *fp;
fp = fopen("example.txt", "r");
if (fp == NULL) {
    printf("文件打开失败\n");
    return 1;
}

3.2 关闭文件

文件操作完成后,必须使用fclose()函数关闭文件,以释放资源并确保数据写入磁盘。fclose()函数的原型如下:

int fclose(FILE *stream);
  • stream:要关闭的文件指针。

示例:

fclose(fp);

4. 文件的读写操作

4.1 读取文件

C语言提供了多种读取文件的函数,常用的有:

  • fgetc():从文件中读取一个字符。

  • fgets():从文件中读取一行字符串。

  • fread():从文件中读取指定数量的数据块。

4.1.1 使用fgetc()读取文件

fgetc()函数用于从文件中读取一个字符,其原型如下:

int fgetc(FILE *stream);

示例:

int ch;
while ((ch = fgetc(fp)) != EOF) {
    putchar(ch);
}
4.1.2 使用fgets()读取文件

fgets()函数用于从文件中读取一行字符串,其原型如下:

char *fgets(char *str, int n, FILE *stream);
  • str:存储读取内容的缓冲区。

  • n:最多读取的字符数(包括结尾的\0)。

  • stream:文件指针。

示例:

char buffer[100];
while (fgets(buffer, sizeof(buffer), fp) != NULL) {
    printf("%s", buffer);
}
4.1.3 使用fread()读取文件

fread()函数用于从文件中读取指定数量的数据块,其原型如下:

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
  • ptr:存储读取数据的缓冲区。

  • size:每个数据块的大小。

  • nmemb:要读取的数据块数量。

  • stream:文件指针。

示例:

char buffer[100];
size_t num = fread(buffer, sizeof(char), sizeof(buffer), fp);
if (num > 0) {
    buffer[num] = '\0';  // 添加字符串结束符
    printf("%s", buffer);
}

4.2 写入文件

C语言提供了多种写入文件的函数,常用的有:

  • fputc():向文件中写入一个字符。

  • fputs():向文件中写入一个字符串。

  • fwrite():向文件中写入指定数量的数据块。

4.2.1 使用fputc()写入文件

fputc()函数用于向文件中写入一个字符,其原型如下:

int fputc(int c, FILE *stream);

示例:

fputc('A', fp);
4.2.2 使用fputs()写入文件

fputs()函数用于向文件中写入一个字符串,其原型如下:

int fputs(const char *str, FILE *stream);

示例:

fputs("Hello, World!\n", fp);
4.2.3 使用fwrite()写入文件

fwrite()函数用于向文件中写入指定数量的数据块,其原型如下:

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  • ptr:要写入的数据的指针。

  • size:每个数据块的大小。

  • nmemb:要写入的数据块数量。

  • stream:文件指针。

示例:

char buffer[] = "Hello, World!";
fwrite(buffer, sizeof(char), sizeof(buffer), fp);

5. 文件的定位操作

在文件操作中,有时需要移动文件指针到指定位置进行读写操作。C语言提供了以下函数来实现文件指针的定位:

  • fseek():移动文件指针到指定位置。

  • ftell():获取文件指针的当前位置。

  • rewind():将文件指针移动到文件开头。

5.1 使用fseek()定位文件指针

fseek()函数用于移动文件指针到指定位置,其原型如下:

int fseek(FILE *stream, long offset, int whence);
  • stream:文件指针。

  • offset:偏移量。

  • whence:起始位置,可以是以下值之一:

    • SEEK_SET:文件开头。

    • SEEK_CUR:当前位置。

    • SEEK_END:文件末尾。

示例:

fseek(fp, 10, SEEK_SET);  // 将文件指针移动到文件开头后的第10个字节

5.2 使用ftell()获取文件指针位置

ftell()函数用于获取文件指针的当前位置,其原型如下:

long ftell(FILE *stream);

示例:

long pos = ftell(fp);
printf("当前文件指针位置:%ld\n", pos);

5.3 使用rewind()重置文件指针

rewind()函数用于将文件指针移动到文件开头,其原型如下:

void rewind(FILE *stream);

示例:

rewind(fp);  // 将文件指针移动到文件开头

6. 文件的错误处理

在文件操作过程中,可能会遇到各种错误,如文件打开失败、读写错误等。C语言提供了以下函数来处理文件操作中的错误:

  • feof():检查文件是否到达末尾。

  • ferror():检查文件操作是否出错。

6.1 使用feof()检查文件末尾

feof()函数用于检查文件是否到达末尾,其原型如下:

int feof(FILE *stream);

示例:

while (!feof(fp)) {
    int ch = fgetc(fp);
    if (ch != EOF) {
        putchar(ch);
    }
}

6.2 使用ferror()检查文件错误

ferror()函数用于检查文件操作是否出错,其原型如下:

int ferror(FILE *stream);

示例:

if (ferror(fp)) {
    printf("文件操作出错\n");
}

7. 文件的删除与重命名

C语言提供了remove()rename()函数来删除和重命名文件。

7.1 使用remove()删除文件

remove()函数用于删除文件,其原型如下:

int remove(const char *filename);

示例:

if (remove("example.txt") == 0) {
    printf("文件删除成功\n");
} else {
    printf("文件删除失败\n");
}

7.2 使用rename()重命名文件

rename()函数用于重命名文件,其原型如下:

int rename(const char *old_filename, const char *new_filename);

示例:

if (rename("old.txt", "new.txt") == 0) {
    printf("文件重命名成功\n");
} else {
    printf("文件重命名失败\n");
}

8. 综合示例

#include <stdio.h>

int main() {
    FILE *fp;
    char buffer[100];

    // 打开文件
    fp = fopen("example.txt", "r+");
    if (fp == NULL) {
        printf("文件打开失败\n");
        return 1;
    }

    // 读取文件内容
    printf("文件内容:\n");
    while (fgets(buffer, sizeof(buffer), fp) != NULL) {
        printf("%s", buffer);
    }

    // 写入文件内容
    fseek(fp, 0, SEEK_END);  // 将文件指针移动到文件末尾
    fputs("这是新写入的内容\n", fp);

    // 关闭文件
    fclose(fp);

    return 0;
}

结语

通过本文的介绍,相信读者已经对C语言中的文件操作有了深入的理解。文件操作是C语言编程中非常重要的一部分,掌握这些操作可以帮助我们更好地处理文件数据。希望本文能够对读者在实际编程中有所帮助。

路过的佬们点点关注哦~

你们的鼓励是我前进的动力~

-------------------------------------------end-------------------------------------

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

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

相关文章

EasyExcel 导出合并层级单元格

EasyExcel 导出合并层级单元格 一、案例 案例一 1.相同订单号单元格进行合并 合并结果 案例二 1.相同订单号的单元格进行合并2.相同订单号的总数和总金额进行合并 合并结果 案例三 1.相同订单号的单元格进行合并2.相同订单号的商品分类进行合并3.相同订单号的总数和总金额…

WPF 进度条(ProgressBar)示例一

本文讲述&#xff1a;WPF 进度条(ProgressBar)简单的样式修改和使用。 进度显示界面&#xff1a;使用UserControl把ProgressBar和进度值以及要显示的内容全部组装在UserControl界面中&#xff0c;方便其他界面直接进行使用。 <UserControl x:Class"DefProcessBarDemo…

LabVIEW自定义测量参数怎么设置?

以下通过一个温度采集案例&#xff0c;说明在 LabVIEW 中设置自定义测量参数的具体方法&#xff1a; 案例背景 ​ 假设使用 NI USB-6009 数据采集卡 和 热电偶传感器 监测温度&#xff0c;需自定义以下参数&#xff1a; 采样率&#xff1a;1 kHz 输入量程&#xff1a;0~10 V&a…

新能源产业的质量革命:六西格玛培训如何重塑制造竞争力

在新能源行业狂飙突进的今天&#xff0c;企业若想在全球供应链中占据高地&#xff0c;仅靠技术突破已远远不够。制造效率的毫厘之差&#xff0c;可能成为市场话语权的千里之距。某光伏巨头曾因电池片良率低于行业均值1.5%&#xff0c;导致年损失超2.3亿元——这恰恰印证了六西格…

(11)gdb 笔记(4):设置执行方向 set exec-direction,

&#xff08;28&#xff09;引入 record 后&#xff0c;可以 设置执行方向 set exec-direction &#xff1a; 实践&#xff1a; &#xff08;29&#xff09; &#xff08;33&#xff09; 谢谢

redis持久化理论

0 前言 什么是持久化 redis操作都是在内存中&#xff0c;如果出现宕机的话&#xff0c;数据将不复存在&#xff0c;所以持久化是将内存中的数据刷盘到磁盘中&#xff0c;redis可以提供RDB和AOF将数据写入磁盘中。 一 持久化技术 本章节将介绍持久化RDB和AOF两个技术&#xf…

25/2/7 <机器人基础>雅可比矩阵计算 雅可比伪逆

雅可比矩阵计算 雅可比矩阵的定义 假设我们有一个简单的两个关节的平面机器人臂&#xff0c;其末端执行器的位置可以表示为&#xff1a; 其中&#xff1a; L1​ 和 L2 是机器人臂的长度。θ1​ 和 θ2是关节的角度。 计算雅可比矩阵 雅可比矩阵 JJ 的定义是将关节速度与末…

鸿蒙UI(ArkUI-方舟UI框架)- 使用文本

返回主章节 → 鸿蒙UI&#xff08;ArkUI-方舟UI框架&#xff09; 文本使用 文本显示 (Text/Span) Text是文本组件&#xff0c;通常用于展示用户视图&#xff0c;如显示文章的文字内容。Span则用于呈现显示行内文本。 创建文本 string字符串 Text("我是一段文本"…

科技赋能数字内容体验的核心技术探索

内容概要 在数字化时代&#xff0c;科技的迅猛发展为我们的生活和工作带来了深刻的变革。数字内容体验已经成为人们获取信息和娱乐的重要途径&#xff0c;而这背后的技术支持则扮演着至关重要的角色。尤其是在人工智能、虚拟现实和区块链等新兴技术的推动下&#xff0c;数字内…

详细教程 | 如何使用DolphinScheduler调度Flink实时任务

Apache DolphinScheduler 非常适用于实时数据处理场景&#xff0c;尤其是与 Apache Flink 的集成。DolphinScheduler 提供了丰富的功能&#xff0c;包括任务依赖管理、动态调度、实时监控和日志管理&#xff0c;能够有效简化 Flink 实时任务的管理和部署。通过 DolphinSchedule…

棋盘(二维差分)

题目&#xff1a; 5396. 棋盘 题目 提交记录 讨论 题解 视频讲解 小蓝拥有 nnnn 大小的棋盘&#xff0c;一开始棋盘上全都是白子。 小蓝进行了 mm 次操作&#xff0c;每次操作会将棋盘上某个范围内的所有棋子的颜色取反(也就是白色棋子变为黑色&#xff0c;黑色棋子变…

MySQL数据库基础(创建/删除 数据库/表)

一、数据库的操作 1.1 显示当前数据库 语法&#xff1a;show databases&#xff1b; <1>show 是一个关键字&#xff0c;表示要执行的操作类型 <2>databases 是复数&#xff0c;表示显示所有数据库 上面的数据库中&#xff0c;除了java113&#xff0c;其它的数据库…

【WebLogic】Oracle发布WebLogic 14c最新版本-14.1.2.0

根据Oracle官方产品经理的博客&#xff0c;Oracle于2024年12月20日正式对外发布了WebLogic 14c的第二个正式版本&#xff0c;版本号为 14.1.2.0.0 &#xff0c;目前官方已开放客户端下载。该版本除继续支持 Jakarta EE 8 版本外&#xff0c;还增加了对 Java SE 17&#xff08;J…

SQL Server 数据库迁移到 MySQL 的完整指南

文章目录 引言一、迁移前的准备工作1.1 确定迁移范围1.2 评估兼容性1.3 备份数据 二、迁移工具的选择2.1 使用 MySQL Workbench2.2 使用第三方工具2.3 手动迁移 三、迁移步骤3.1 导出 SQL Server 数据库结构3.2 转换数据类型和语法3.3 导入 MySQL 数据库3.4 迁移数据3.5 迁移存…

springboot+vue导入ruoyi项目的框架

一、介绍 RuoYi-Vue版本&#xff0c;采用了前后端分离的单体架构设计软件环境&#xff1a;JDK、Mysql、Redis、Maven、Node技术选型: Spring Boot、Spring Security、MyBatis、Jwt、Vue3、Element-Plus官方地址: https://gitee.com/y_project/RuoYi-Vue 官方推荐的版本如下&a…

jvm 篇

字节码的作用 ‌跨平台性‌&#xff1a;字节码是Java实现跨平台特性的关键。Java源代码编译成字节码后&#xff0c;可以在任何安装了Java虚拟机&#xff08;JVM&#xff09;的设备上运行&#xff0c;这使得Java应用程序能够在不同的操作系统和硬件平台上运行而无需重新编译。‌…

【Springboot】Springboot 自定义线程池的参数配置最优是多少

博主介绍&#xff1a;✌全网粉丝22W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…

【2】Cisco SD-WAN 组件介绍

1. 概述 Cisco SD-WAN 是一套基于软件定义的广域网(SD-WAN)解决方案,能够提供安全、可扩展且高效的网络连接。它通过集中的控制和智能路径选择,实现跨多个站点的可靠性、可见性和优化。 在 Cisco SD-WAN 体系架构中,主要由四个核心组件构成: vManage(管理平面) vSmart…

测试中的第一性原理:回归本质的质量思维革命

在软件工程领域&#xff0c;测试活动常被惯性思维和经验主义所主导——测试用例库无限膨胀、自动化脚本维护成本居高不下、测试策略与业务目标渐行渐远。要突破这种困境&#xff0c;第一性原理&#xff08;First Principles Thinking&#xff09;提供了独特的解题视角&#xff…

《chatwise:DeepSeek的界面部署》

ChatWise&#xff1a;DeepSeek的界面部署 摘要 本文详细描述了DeepSeek公司针对其核心业务系统进行的界面部署工作。从需求分析到技术实现&#xff0c;再到测试与优化&#xff0c;全面阐述了整个部署过程中的关键步骤和解决方案。通过本文&#xff0c;读者可以深入了解DeepSee…