如何进行文件的读取和写入操作?

C语言文件的读取和写入操作详解

文件操作是C语言中常见的任务之一,它允许你从文件中读取数据并将数据写入文件。无论是处理文本文件还是二进制文件,文件操作在程序中都是非常重要的。在本文中,我们将深入探讨如何进行文件的读取和写入操作,包括文本文件和二进制文件的处理。

第一部分:打开和关闭文件

在进行文件读取和写入之前,首先需要打开文件。打开文件是使用 fopen() 函数完成的。该函数的一般形式如下:

FILE *fptr; // 文件指针
fptr = fopen("filename", "mode");
  • filename 是要打开的文件的名称,可以是相对路径或绝对路径。
  • mode 是打开文件的模式,它指定文件是用于读取、写入还是追加等。常见的模式包括:
    • "r":只读模式(读取文件内容)。
    • "w":写入模式(创建新文件或截断已有文件)。
    • "a":追加模式(在已有文件末尾添加内容)。
    • "rb":二进制只读模式(读取二进制文件内容)。
    • "wb":二进制写入模式(创建新的二进制文件或截断已有文件)。
    • "ab":二进制追加模式(在已有二进制文件末尾添加内容)。

打开文件后,如果操作完成或程序不再需要访问该文件,应使用 fclose() 函数关闭文件。关闭文件有助于释放系统资源,并确保文件操作的一致性。

fclose(fptr);

以下是一个示例,演示如何打开和关闭文件:

#include <stdio.h>int main() {FILE *fptr; // 文件指针fptr = fopen("example.txt", "w"); // 打开文件以写入模式if (fptr == NULL) {printf("文件打开失败\n");return 1;}// 在文件中写入数据fprintf(fptr, "这是一个示例文件\n");fprintf(fptr, "用于演示文件操作\n");// 关闭文件fclose(fptr);printf("文件已成功写入并关闭\n");return 0;
}

第二部分:文本文件的读取和写入

2.1 文本文件的写入

打开文本文件后,可以使用 fprintf() 函数将数据写入文件。这个函数的使用方法与 printf() 函数类似,只是它将数据写入文件而不是屏幕。

以下是一个示例,演示如何将文本数据写入文件:

#include <stdio.h>int main() {FILE *fptr; // 文件指针fptr = fopen("example.txt", "w"); // 打开文件以写入模式if (fptr == NULL) {printf("文件打开失败\n");return 1;}// 在文件中写入数据fprintf(fptr, "这是一个示例文件\n");fprintf(fptr, "用于演示文件操作\n");// 关闭文件fclose(fptr);printf("文件已成功写入并关闭\n");return 0;
}

在上面的示例中,我们首先打开了一个名为 "example.txt" 的文件以写入模式,然后使用 fprintf() 函数将文本数据写入文件,最后关闭了文件。

2.2 文本文件的读取

要从文本文件中读取数据,可以使用 fscanf() 函数。这个函数的使用方法类似于 scanf() 函数,但它从文件中读取数据而不是从键盘输入。

以下是一个示例,演示如何从文本文件中读取数据:

#include <stdio.h>int main() {FILE *fptr; // 文件指针char data[100]; // 存储读取的数据的数组fptr = fopen("example.txt", "r"); // 打开文件以只读模式if (fptr == NULL) {printf("文件打开失败\n");return 1;}// 从文件中读取数据while (fscanf(fptr, "%s", data) != EOF) {printf("%s ", data); // 打印读取的数据}// 关闭文件fclose(fptr);return 0;
}

在上面的示例中,我们首先打开了名为 "example.txt" 的文件以只读模式,然后使用 fscanf() 函数从文件中读取数据,最后关闭了文件。

2.3 逐行读取文本文件

有时候,你可能需要逐行读取文本文件。为了实现这一点,你可以使用 fgets() 函数,它可以从文件中读取一行文本。

以下是一个示例,演示如何逐行读取文本文件:

#include <stdio.h>int main() {FILE *fptr; // 文件指针char line[100]; // 存储读取的一行数据的数组fptr = fopen("example.txt", "r"); // 打开文件以只读模式if (fptr == NULL) {printf("文件打开失败\n");return 1;}// 逐行读取文件while (fgets(line, sizeof(line), fptr) != NULL) {printf("%s", line); // 打印读取的一行数据}// 关闭文件fclose(fptr);return 0;
}

在上面的示例中,我们使用 fgets() 函数逐行读取文件,并将每行的内容打印到屏幕上。

第三部分:二进制文件的读取和写入

3.1 二进制文件的写入

与文本文件不同,二进制文件以字节为单位进行操作。你可以使用 fwrite() 函数将二进制数据写入文件。

以下是一个示例,演示如何将二进制数据写入文件:

#include <stdio.h>int main() {FILE *fptr; // 文件指针int data[5] = {10, 20, 30, 40, 50}; // 一些整数数据fptr = fopen("binary_data.dat", "wb"); // 以二进制写入模式打开文件if (fptr == NULL) {printf("文件打开失败\n");return 1;}// 写入二进制数据fwrite(data, sizeof(int), 5, fptr);// 关闭文件fclose(fptr);printf("二进制文件已成功写入并关闭\n");return 0;
}

在上面的示例中,我们首先打开了一个名为 "binary_data.dat" 的文件以二进制写入模式,然后使用 fwrite() 函数将整数数组写入文件,最后关闭了文件。

3.2 二进制文件的读取

要从二进制文件中读取数据,可以使用 fread() 函数。

以下是一个示例,演示如何从二进制文件中读取数据:

#include <stdio.h>int main() {FILE *fptr; // 文件指针int data[5]; // 存储读取的整数数据的数组fptr = fopen("binary_data.dat", "rb"); // 以二进制只读模式打开文件if (fptr == NULL) {printf("文件打开失败\n");return 1;}// 从文件中读取二进制数据fread(data, sizeof(int), 5, fptr);// 关闭文件fclose(fptr);// 打印读取的数据for (int i = 0; i < 5; i++) {printf("%d ", data[i]);}return 0;
}

在上面的示例中,我们首先打开了名为 "binary_data.dat" 的文件以二进制只读模式,然后使用 fread() 函数从文件中读取整数数组,最后关闭了文件并打印读取的数据。

第四部分:文件指针位置

在进行文件读取和写入操作时,文件指针是一个重要的概念。文件指针指示了文件中当前读取或写入的位置。默认情况下,文件指针位于文件的开头,但你可以使用 fseek() 函数来设置文件指针的位置。

4.1 设置文件指针位置

fseek() 函数用于设置文件指针的位置。它的一般形式如下:

int fseek(FILE *stream, long offset, int origin);
  • stream 是文件指针。
  • offset 是要设置的偏移量,可以是正数、负数或零,表示相对于 origin 的偏移。
  • origin 可以是以下值之一:
    • SEEK_SET:从文件开头开始偏移。
    • SEEK_CUR:从当前位置开始偏移。
    • SEEK_END:从文件末尾开始偏移。

以下是一个示例,演示如何使用 fseek() 设置文件指针位置:

#include <stdio.h>int main() {FILE *fptr; // 文件指针char ch;fptr = fopen("example.txt", "r"); // 打开文件以只读模式if (fptr == NULL) {printf("文件打开失败\n");return 1;}// 设置文件指针位置到第三个字符处fseek(fptr, 2, SEEK_SET);// 读取并打印文件指针位置后的字符ch = fgetc(fptr);printf("当前位置的字符: %c\n", ch);// 关闭文件fclose(fptr);return 0;
}

在上面的示例中,我们使用 fseek() 将文件指针位置设置为从文件开头偏移两个字符的位置,然后使用 fgetc() 读取并打印了该位置处的字符。

4.2 获取文件指针位置

要获取文件指针当前的位置,可以使用 ftell() 函数。这个函数返回当前位置相对于文件开头的偏移量。

以下是一个示例,演示如何使用 ftell() 获取文件指针位置:

#include <stdio.h>int main() {FILE *fptr; // 文件指针long position;fptr = fopen("example.txt", "r"); // 打开文件以只读模式if (fptr == NULL) {printf("文件打开失败\n");return 1;}// 获取文件指针位置position = ftell(fptr);printf("当前位置相对于文件开头的偏移量: %ld\n", position);// 关闭文件fclose(fptr);return 0;
}

在上面的示例中,我们使用 ftell() 获取了文件指针当前的位置,并打印了偏移量。

第五部分:错误处理

在文件操作中,错误处理是非常重要的,因为文件操作可能会失败,例如文件不存在或没有读写权限。为了处理这些情况,你可以使用 feof()ferror() 函数来检查文件的结束和错误状态。

  • feof() 函数检查文件是否已达到文件末尾。如果已经到达文件末尾,它返回非零值,否则返回零。

  • ferror() 函数检查文件的错误状态。如果发生错误,它返回非零值,否则返回零。

以下是一个示例,演示如何使用 feof()ferror() 进行错误处理:

#include <stdio.h>int main() {FILE *fptr; // 文件指针char ch;fptr = fopen("nonexistent.txt", "r"); // 打开不存在的文件以只读模式if (fptr == NULL) {printf("文件打开失败\n");return 1;}// 读取文件内容while ((ch = fgetc(fptr)) != EOF) {putchar(ch);}// 检查文件状态if (feof(fptr)) {printf("已达文件末尾\n");}if (ferror(fptr)) {printf("发生文件错误\n");}// 关闭文件fclose(fptr);return 0;
}

在上面的示例中,我们尝试打开一个不存在的文件,然后使用 feof()ferror() 检查文件状态。由于文件不存在,fptr 将为 NULL,并且 feof(fptr) 返回非零值,ferror(fptr) 返回零。

第六部分:总结

文件操作是C语言编程中的重要部分,本文详细介绍了如何进行文件的读取和写入操作,包括文本文件和二进制文件的处理。以下是本文涵盖的主要内容:

  • 打开和关闭文件,使用 fopen()fclose() 函数。
  • 文本文件的读取和写入,使用 fprintf()fscanf()fgets() 函数。
  • 二进制文件的读取和写入,使用 fwrite()fread() 函数。
  • 文件指针位置的设置和获取,使用 fseek()ftell() 函数。
  • 错误处理,使用 feof()ferror() 函数。

掌握文件操作是C语言编程的基本技能之一,它允许你处理各种类型的数据,从简单的文本文件到复杂的二进制数据。在实际编程中,你可能需要频繁地进行文件读取和写入操作,因此了解这些基本概念和函数是非常重要的。希望本文能够帮助你更好地理解C语言文件操作的原理和实践。

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

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

相关文章

【蓝桥杯选拔赛真题62】Scratch判断小球 少儿编程scratch图形化编程 蓝桥杯选拔赛真题解析

目录 scratch判断小球 一、题目要求 编程实现 二、案例分析 1、角色分析

第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组 试题 B: 双子数

[蓝桥杯 2023 国 B] 双子数 试题 B: 双子数 【问题描述】 若一个正整数 x x x 可以被表示为 p 2 q 2 p^2 \times q^2 p2q2&#xff0c;其中 p p p、 q q q 为质数且 p ≠ q p \neq q pq&#xff0c;则 x x x 是 一个 “双子数”。请计算区间 [ 2333 , 233333333333…

API接口自动化测试框架

前言 接口自动化逐渐成为各大公司投入产出最高的测试技术。但是如何在版本迅速迭代过程中提高接口自动化的测试效率&#xff0c;仍然是大部分公司需要解决的问题。 框架定位 数据驱动设计模式&#xff0c;无需写测试代码脚本即可实现自动化等价类非等价类覆盖&#xff0c; E2E…

数组01-二分查找算法

目录 数组如何实现随机访问 两个关键词 数组的特点 根据下标随机访问数组元素 为什么数组要从0开始编号&#xff0c;而不是从1开始 LeetCode之路——704. 二分查找 Code 二分查找算法 数组如何实现随机访问 数组&#xff08;Array&#xff09;是一种线性表数据结构。它…

C语言——运算符

C用运算符表示算术运算。 C没有指数运算符&#xff0c;不过&#xff0c;C的标准数学库提供了一个pow()函数用于指数运算。 基本运算符 赋值运算符&#xff1a; 变量名变量值 从右到左 左值和变量名的区别&#xff1a; 变量名是一个标识符的名称&#xff0c;左值是一个可变…

利用EasyX图形库实现趣味化编程note1

学习太久枯燥乏味&#xff1f;学习完Easyx图形库&#xff0c;创造无限可能。 首先来讲一下什么是图形库&#xff0c;图形库在屏幕上渲染图像的程序库&#xff0c;为我们提供了一组函数进行渲染&#xff0c;常见的图形库有QT,GTK,Windows GDI&#xff0c;著名的WPS就是用QT图形库…

视频汇聚/安防监控平台EasyCVR指定到新的硬盘进行存储录像,如何自动挂载该磁盘?

TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&…

多线程的死锁问题

可重入和不可重入&#x1f60a;&#x1f60a;&#x1f60a; 一个线程针对同一个对象,连续加锁两次,是否会有问题 ~~ 如果没问题,就叫可重入的.如果有问题,就叫不可重入的. 代码示例&#x1f349;&#x1f349;&#x1f349;: synchronized public void add(){synchronized (…

大模型助力企业数据驱动,火山引擎数智平台发布AI助手

9月19日&#xff0c;火山引擎在其举办的“V-Tech数据驱动科技峰会”上宣布&#xff0c;火山引擎数智平台VeDI推出“AI助手”&#xff0c;通过接入人工智能大模型&#xff0c;帮助企业提升数据处理和查询分析的效率。即使是不会写代码的运营人员&#xff0c;和大模型对话也能做好…

【CNN-FPGA开源项目解析】卷积层03--单格乘加运算单元PE 单窗口卷积块CU 模块

03–单格乘加运算单元PE & 单窗口卷积块CU 文章目录 03--单格乘加运算单元PE & 单窗口卷积块CU前言单格乘加运算单元PE代码模块结构时序逻辑分析对其上层模块CU的要求 单窗口卷积块CU代码逻辑分析 前言 ​ 第一和第二篇日志已经详细阐述了"半精度浮点数"的加…

贪心算法-

代码随想录 什么是贪心 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 这么说有点抽象&#xff0c;来举一个例子&#xff1a; 例如&#xff0c;有一堆钞票&#xff0c;你可以拿走十张&#xff0c;如果想达到最大的金额&#xff0c;你要怎么拿&#xff…

通过 HelpLook ChatBot AI自动问答机器人降低客户服务成本

在当今竞争激烈的商业环境中&#xff0c;提供卓越的客户服务对于维持忠诚的客户群和推动业务增长至关重要。客户服务涵盖了公司与其客户之间的所有互动&#xff0c;包括解答问题、解决问题和提供支持。它在塑造客户对品牌的看法方面起着关键作用&#xff0c;并且可以显著影响他…

如何通过bat批处理实现快速生成文件目录,一键生成文件名和文件夹名目录

碰对了情人&#xff0c;相思一辈子。 具体方法步骤&#xff1a; 一、创建一个执行bat文件&#xff08;使用记事本即可&#xff09;&#xff1b; 1、新建一个txt文本空白记事本文件 2、复制以下内容进记事本内 dir/a/s/b>LIST.TXT &#xff08;其中LIST.TXT文件名是提取后将…

【微服务】spring 控制bean加载顺序使用详解

目录 一、前言 二、使用order注解控制顺序 2.1 order 注解使用示例 2.2 order注解顺序失效问题 2.2.1 order失效问题解决办法 2.3 实现Ordered接口 三、使用dependon注解控制顺序 四、AutoConfiguration注解控制bean加载顺序 4.1 AutoConfigureBefore 操作演示 4.2 A…

安防视频平台EasyCVR视频调阅全屏播放显示异常是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

AIRIOT亮相IOTE2023深圳物联网展,产品创新力再获“IOTE金奖”

9月20-22日&#xff0c;IOTE 2023第二十届深圳国际物联网展在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为物联网领域年度最重要的行业盛会之一&#xff0c;本届展会以“IoT构建数字经济底座”为主题&#xff0c;汇聚全球来自工业、物流、基建、智慧城市、智慧…

freemarker自定义模板

模板编程器指南 <dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.31</version> </dependency>freemarker官网参考&#xff1a; https://freemarker.apache.org/docs/pgui_qu…

浏览器原生JavaScript离线文字转语音TTS播放,支持Windows自带TTS语音和移动端(安卓、IOS)

前言 JS已经可以实现语音合成(文字转语音)和语音识别(语音转文字),各个浏览器支持列表如下所示: 语音识别支持列表: 因此,浏览器上面使用语音合成非常简单。 页面效果示例: 实现功能 1、支持速度,音调设置 2、支持下拉选择语音模板 3、文字转语音 代码实现 …

云服务器 CentOS7 操作系统上安装Jpress (Tomcat 部署项目)

1、xShell 和 xftp 下载安装&#xff08;略&#xff09; https://www.xshell.com/zh/free-for-home-school/2、xftp 连接云服务器 xftp 新建连接 3、JDK 压缩包下载 下载 jdk1.8 注&#xff1a;此处 CentOS7 是64位&#xff0c;所以下载的是&#xff1a;Linux x64&#xf…

Hbuilder本地调试微信H5项目(二)--添加UView框架插件

摘要 在一个已创建的Hbuilder项目中&#xff0c;添加uView框架插件 前置准备 已安装Hbuilder 已创建uni-app的H5默认模板项目 实现逻辑 在Hbuilder官网找到组件说明页面 下载插件并导入HbuilderX 具体实现 访问网站 访问网址Hbuilder的uView1.8.6版本说明页 或者访问…