C语言中的文件操作指南

阅读导航

  • 前言
  • 一、文件类型
    • 1. 程序文件
    • 2. 数据文件
    • PS.文件名
  • 二、文件的打开和关闭
    • 1. 文件指针
    • 2. 文件的打开和关闭
  • 三、文件的顺序读写
  • 四、文件的随机读写
    • 1. fseek() 函数
    • 2. ftell() 函数
    • 3. rewind() 函数
  • 总结

前言

在C语言中,文件操作是一项重要的任务。通过文件操作,我们可以读取和写入文件的内容,实现数据的长期存储和共享。文件操作不仅可以用于文本文件,还可以用于二进制文件、配置文件等各种类型的文件。

这篇文章中,我们将深入探讨C语言文件操作的各个方面,介绍常用的文件操作函数和技巧,帮助读者更好地理解和应用文件操作。无论是初学者还是有一定经验的开发者,都能从中获得实用的知识和技能,为自己的C语言编程之路增添新的可能性。

一、文件类型

1. 程序文件

⭕程序文件是包含C源代码的文件,它们经过编译和链接后可以生成可执行程序。程序文件中定义了变量、函数、结构体等程序元素,通过编写相应的代码实现所需的功能。在程序文件中,我们可以使用各种控制结构、输入输出函数和库函数来操作和处理数据。

2. 数据文件

⭕数据文件是包含实际数据的文件,可以是文本文件或二进制文件。文本文件以可读的文本形式存储数据,可以使用标准的输入输出函数(如printf和scanf)来读取和写入文本文件。二进制文件以二进制形式存储数据,一般需要使用专门的读写函数进行处理。

PS.文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。
文件名包含3部分:文件路径+文件名主干+文件后缀。 例如: c:\code\test.txt
为了方便起见,文件标识常被称为文件名。

在这里插入图片描述

二、文件的打开和关闭

1. 文件指针

文件指针是C语言中用于定位和访问文件的机制。它是一个特殊的变量,用来指示当前操作的位置或位置的偏移量。通过文件指针,我们可以进行读写操作,并在文件中移动指针的位置。

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名FILE.

struct _iobuf {char *_ptr;int   _cnt;char *_base;int   _flag;int   _file;int   _charbuf;int   _bufsiz;char *_tmpfname;};
typedef struct _iobuf FILE;

不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异

文件指针的位置决定了下一次读写操作的位置。例如,在读取文件内容时,每次读取前文件指针会自动后移,以便下次读取从下一个位置开始。

另外,文件指针还有几个重要的特殊位置:

  • 文件起始位置(0):文件打开后,文件指针通常位于文件起始位置,即偏移量为0的位置。

  • 文件末尾位置(EOF):表示文件的结尾,文件指针在读取到文件末尾时会自动停止读取操作。

  • 文件错误位置(NULL):在发生错误时,文件指针可能为NULL,表示无法继续操作文件。
    在这里插入图片描述

在使用文件指针时,我们需要注意一些常见的问题。首先,操作文件前必须确保文件已经成功打开,并在使用完毕后及时关闭文件,以便释放资源。其次,应注意异常情况的处理,如文件不存在、权限不足等,以避免程序崩溃或产生错误结果。

2. 文件的打开和关闭

文件的打开和关闭是文件处理中非常重要的操作。在进行文件读写时,必须先打开文件,然后进行读写操作,最后再关闭文件。这样做可以避免文件资源泄漏和数据损坏等问题。

在C语言中,文件的打开和关闭可以通过文件操作函数来实现。其中,常用的文件操作函数包括fopenfclose等。下面是一个基本的文件打开和关闭的示例:

#include <stdio.h>int main()
{FILE *fp;char filename[20];// 打开文件printf("请输入要打开的文件名:");scanf("%s", filename);fp = fopen(filename, "r");if (fp == NULL) {printf("文件打开失败!\n");return 1;}printf("文件打开成功!\n");// 文件读取或写入操作…// 关闭文件fclose(fp);printf("文件已关闭!\n");return 0;
}

上述代码中,我们首先定义了一个指向文件的指针(FILE *fp),然后通过fopen函数打开文件。fopen函数的第一个参数是文件名或路径(字符串类型),第二个参数是打开文件的模式(字符串类型)。文件打开模式包括:

文件使用方式含义如果指定文件不存在
“r” (只读)为了输入数据,打开一个已经存在的文本文件出错
“w” (只写)为了输出数据,打开一个文本文件建立一个新的文件
“a” (追加)向文本文件尾添加数据建立一个新的文件
“rb” (只读)为了输入数据,打开一个二进制文件出错
“wb” (只写)为了输出数据,打开一个二进制文件建立一个新的文件
“ab” (追加)向一个二进制文件尾添加数据出错
“r+” (读写)为了读和写,打开一个文本文件出错
“w+” (读写)为了读和写,建议一个新的文件建立一个新的文件
“a+” (读写)打开一个文件,在文件尾进行读写建立一个新的文件
“rb+” (读写)为了读和写打开一个二进制文件出错
“wb+” (读写)为了读和写,新建一个新的二进制文件建立一个新的文件
“ab+” (读写)打开一个二进制文件,在文件尾进行读和写建立一个新的文件

在打开文件后,我们可以进行读写操作。最后通过fclose函数关闭文件,以释放资源。如果在打开文件时出现错误,则返回的指针为NULL,需要进行错误处理。

三、文件的顺序读写

当打开文件时,可以通过指定不同的访问模式来控制文件读写的方式。在选择读写模式后,就可以使用文件指针进行读写操作。

⭕常见的读写函数有:

功能函数名适用于
字符输入fgetc所有输入流
字符输出fputc所有输出流
文本行输入fgets所有输入流
文本行输出fputs所有输出流
格式化输入fscanf所有输入流
格式化输出fprintf所有输出流
二进制输入fread文件
二进制输出fwrite文件

下面是一个示例代码,用于在文本文件中按顺序读取和写入数据:

#include <stdio.h>int main() {FILE *fp = fopen("example.txt", "r");char str[255];if (fp == NULL) {printf("Error opening file\n");return -1;}// 读取每一行并输出while (fgets(str, 255, fp) != NULL) {printf("%s", str);}fclose(fp);// 向文件中写入数据fp = fopen("example.txt", "a");if (fp == NULL) {printf("Error opening file\n");return -1;}fprintf(fp, "This is a new line\n");fclose(fp);return 0;
}

该示例程序首先以只读模式打开文件 example.txt,然后使用 fgets 函数按照行读取数据并输出。接着,它再以追加模式打开同一个文件,并使用 fprintf 函数向文件中写入一行新数据。

四、文件的随机读写

1. fseek() 函数

fseek 是一个用于设置文件指针位置的函数。它的原型如下:

int fseek(FILE *stream, long offset, int origin);

参数说明:

  • stream:指向要设置位置的文件流的指针。
  • offset:要添加到或减去当前位置的字节数,可以是正数或负数。
  • origin:用于确定 offset 如何解释的常量。可以使用以下值之一:
    • SEEK_SET:从文件开头开始计算偏移量。
    • SEEK_CUR:从当前位置开始计算偏移量。
    • SEEK_END:从文件末尾开始计算偏移量。

返回值为 0 表示成功,非零值表示出错。

使用 fseek 可以将文件指针定位到文件中的任意位置进行读写操作。例如,要将文件指针定位到文件开头,可以使用如下代码:

FILE *fp = fopen("example.txt", "r");
if (fp == NULL) {printf("Error opening file\n");return -1;
}// 将文件指针设置到文件开头
fseek(fp, 0, SEEK_SET);// 在此处进行读取操作fclose(fp);

在上述代码中,我们打开了一个名为 example.txt 的文件,并将文件指针通过 fseek 函数定位到了文件的开头位置。

2. ftell() 函数

ftell 是一个用于获取文件指针当前位置的函数。它的原型如下:

long ftell(FILE* stream);

参数 stream 是指向要获取当前位置的文件流的指针。返回值是当前位置相对于文件开头的字节数(偏移量)

以下是一个示例代码,演示了如何使用 ftell 函数获取文件指针的当前位置:

#include <stdio.h>int main() {FILE *fp = fopen("example.txt", "r");if (fp == NULL) {printf("Error opening file\n");return -1;}// 定位到文件第6个字节的位置fseek(fp, 5, SEEK_SET);// 获取文件指针的当前位置long position = ftell(fp);printf("Current position: %ld\n", position);fclose(fp);return 0;
}

在上述示例中,我们首先打开一个名为 example.txt 的文件,并使用 fseek 将文件指针定位到文件的第6个字节处。然后,通过调用 ftell 函数获取文件指针的当前位置,并将其打印出来。

🚨🚨注意:ftell 返回的是一个 long 类型的值,表示当前位置相对于文件开头的字节数。如果发生错误,ftell 可能会返回一个特殊的值 EOF(-1)。因此,在使用 ftell 的结果时,应该先检查是否出错。

3. rewind() 函数

rewind 是一个用于将文件指针重新定位到文件开头的函数。它的原型如下:

void rewind(FILE *stream);

参数 stream 是指向要重新定位的文件流的指针。rewind 函数会将文件指针移动到文件开头,即相当于调用 fseek(stream, 0, SEEK_SET)

以下是一个示例代码,演示了如何使用 rewind 函数将文件指针重新定位到文件开头:

#include <stdio.h>int main() {FILE *fp = fopen("example.txt", "r");if (fp == NULL) {printf("Error opening file\n");return -1;}// 将文件指针重新定位到文件开头rewind(fp);// 在此处进行读取操作fclose(fp);return 0;
}

在上述示例中,我们打开一个名为 example.txt 的文件,然后使用 rewind 将文件指针重新定位到文件开头。这样,在之后的读取操作中,可以从文件的开头开始读取数据。

总结

本文介绍了 C 语言中文件操作的基础知识,包括文件类型、文件的打开和关闭、文件的顺序读写和随机读写等。文章首先将文件分为程序文件和数据文件两种类型,并简要说明了它们的区别以及命名方式。接下来,文章详细讲解了文件的打开和关闭过程,包括如何使用文件指针和相关函数打开文件、关闭文件,以及处理错误情况。在讲解完文件的基础操作后,文章介绍了文件的顺序读写和随机读写两种方式,并提供了相应的函数及示例代码进行演示。其中,随机读写部分还详细介绍了 fseek()、ftell() 和 rewind() 等函数的用法。

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

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

相关文章

阿里云在云原生领域喜获多项 OSCAR 开源尖峰案例奖

当前&#xff0c;国内开源技术正逐渐在各领域落地&#xff0c;越来越多的企业已经或准备使用开源&#xff0c;优秀的开源案例可以起到领航和参考作用。为了更好地推动开源技术在中国市场的落地&#xff0c;鼓励企业和厂商使用开源&#xff0c;鼓励企业或个人进一步探索我国开源…

矩阵系统能做什么

矩阵系统可以应用于许多领域&#xff0c;包括但不限于以下方面&#xff1a; 1. 工程领域&#xff1a;在工程项目中&#xff0c;矩阵系统可用于设计和优化结构、系统、网络、电路、热管理等。例如&#xff0c;矩阵系统可以用来分析和预测系统的稳定性、可靠性、响应时间、能耗等…

2023年中国分布式光纤传感产量、需求量及行业市场规模分析[图]

分布式光纤传感器中的光纤能够集传感、传输功能于一体&#xff0c;能够完成在整条光纤长度上环境参量的空间、时间多维连续测量&#xff0c;具有结构简单、易于布设、性价比高、易实现长距离等独特优点&#xff0c;常用的分布式光纤传感器有光时域反射仪、布里渊分析仪、喇曼反…

Outlook导入导出功能灰色,怎么解决

下载安装 Outlook 软件后&#xff0c;登陆账号&#xff0c;然后选择“文件” - “导出”&#xff0c;结果发现“导出”按钮是灰色的&#xff0c;根本无法导出。根据官方说法&#xff1a;由于配置没有完成或者office产品没有正确激活。outlook导出键为灰色原因由于配置没有完成或…

基于nodejs+vue教学辅助管理系统

学生&#xff1b;首页、个人中心、本课程设计了线上教学辅助系统 ,学生可以此系统实现在线学习&#xff0c;作业提交管理、作业成绩管理。随着社会的快速发展&#xff0c;计算机的影响是全面且深入的。教师&#xff1a;首页、个人中心、课程信息管理、教学资料管理、作业信息管…

IDEA的使用(四)创建不同类型的工程(IntelliJ IDEA 2022.1.3版本)

1. 创建Java工程 创建之后&#xff0c;src下是空的。可以在src下创建软件包Package&#xff0c;命名采用域名倒序。在软件包下再创建Java类。Java类运行后出现中文乱码&#xff0c;就到控制台和文件编码这两个地方设置编码。 2. 创建JavaWeb工程 2.1 在win11和IDEA中配置Tomca…

《UnityShader入门精要》学习4

一个最简单的顶点/片元着色器 一个最简单的顶点/片元着色器 Unity Shader的基本结构。它包含了Shader、Properties、SubShader、Fallback等语义块。顶点/片元着色器的结构与之大体类似 Shader "MyShaderName" {Properties {// 属性}SubShader {// 针对显卡A的S…

opencv图形绘制2

目录 制作宣传语&#xff08;中文&#xff09; 制作宣传语&#xff08;英文&#xff09; 绘制标记 鼠标交互绘制十字线 鼠标交互绘制图形 鼠标交互制作几何画板 滚动条控制 鼠标事件练习 制作宣传语&#xff08;中文&#xff09; import cv2 import numpy as np from …

实现Element Select选择器滚动加载

<template><el-selectpopper-class"more-tag-data"v-model"tagId"filterableplaceholder"请选择"focus"focusTag"><el-optionv-for"(item, index) in taskTagLists":key"index":label"item.n…

互联网Java工程师面试题·Java 并发编程篇·第七弹

目录 16、CAS 的问题 17、什么是 Future&#xff1f; 18、什么是 AQS 19、AQS 支持两种同步方式&#xff1a; 20、ReadWriteLock 是什么 21、FutureTask 是什么 22、synchronized 和 ReentrantLock 的区别 23、什么是乐观锁和悲观锁 24、线程 B 怎么知道线程 A 修改了…

蓝桥杯 枚举算法 (c++)

枚举就是根据提出的问题&#xff0c;——列出该问题的所有可能的解&#xff0c;并在逐一列出的过程中&#xff0c;检验每个可能解是否是问题的真正解&#xff0c; 如果是就采纳这个解&#xff0c;如果不是就继续判断下一个。 枚举法一般比较直观&#xff0c;容易理解&#xff0…

完美解决lftp遇到put: Access failed: 553 Could not create file.

目录 一、问题 二、原因 三、解决方法 一、问题 put: Access failed: 553 Could not create file. 二、原因 &#xff08;1&#xff09;没有关闭SeLinux &#xff08;2&#xff09;linux默认安装vsftp服务之后只允许匿名用户的访问和下载&#xff0c;不支持上传。 三、解决方…

matlab 图像均值滤波

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠翻译,放入付费专栏只为防不要脸的爬虫。专栏值钱的不是本文,切勿因本文而订阅。 一、算法原理 均值滤波是一种常用的线性滤波方法,用于平滑图像并减少噪声。它的实现过程如下: 确定滤波器的大小:选择一个固定的…

P1443 马的遍历

#include <iostream> #include <queue> using namespace std; #define M 400 int arr[M 5][M 5]; typedef struct Node {int x, y; } Node; //将马能走的8个方向封装成一个二维数组 int dir[8][2] {{2, 1}, {2, -1}, {-2, 1}, {-2, -1},{1, 2}, {-1, 2}, {1, -2…

nginx的location的优先级和匹配方式

nginx的location的优先级和匹配方式 在http模块中有server&#xff0c;server模块中有location&#xff0c;location匹配的是uri 在一个server中&#xff0c;会有多个location&#xff0c;如何来确定匹配哪个location niginx的正则表达式 ^ 字符串的起始位置 $ 字符串的…

IDEA中查看整个项目代码行数

近期正在手撸Spring源码&#xff0c;想要看下自己写了多少行代码。记录下如何查看项目的代码行数&#xff0c;方便日后查阅

Hadoop3教程(六):HDFS中的DataNode

文章目录 &#xff08;63&#xff09;DataNode工作机制&#xff08;64&#xff09;数据完整性&#xff08;65&#xff09;掉线时限参数设置参考文献 &#xff08;63&#xff09;DataNode工作机制 DataNode内部存储了一个又一个Block&#xff0c;每个block由数据和数据元数据组…

【云计算】相关解决方案介绍

文章目录 1.1 云服务环境 Eucalyptus1.1.1 介绍1.1.2 开源协议及语言1.1.3 官方网站 1.2 开源云计算平台 abiCloud1.2.1 开源协议及语言1.2.2 官方网站 1.3 分布式文件系统 Hadoop1.3.1 开源协议及语言1.3.2 官方网站 1.4 JBoss云计算项目集 StormGrind1.4.1 开源协议及语言1.4…

【数据库——MySQL(实战项目1)】(3)图书借阅系统——存储函数

目录 1. 简述2. 功能代码2.1 创建存储函数&#xff0c;根据图书编号查借阅人姓名&#xff0c;并调用该函数查询‘ **小邓在森林** ’已借未还的图书情况&#xff1b;2.2 创建存储函数&#xff0c;计算某借阅人还能借阅的图书数目&#xff0c;学生限额 5 本&#xff0c;教师限额…

Vue3 + Nodejs 实战 ,文件上传项目--实现文件批量上传(显示实时上传进度)

目录 技术栈 1.后端接口实现 2.前端实现 2.1 实现静态结构 2.2 整合上传文件的数据 2.3 实现一键上传文件 2.4 取消上传 博客主页&#xff1a;専心_前端,javascript,mysql-CSDN博客 系列专栏&#xff1a;vue3nodejs 实战--文件上传 前端代码仓库&#xff1a;jiangjunjie…