(10)文件操作

1. 文件指针的概念和定义

在 C 语言中,文件指针是一种特殊的指针,用于指向一个文件结构体。这个结构体包含了文件的各种信息,如文件名、文件状态、当前文件位置指针等。通过文件指针,程序可以对文件进行各种操作。

文件指针的定义形式如下:

FILE *fp;

这里FILE是一个在<stdio.h>头文件中定义的结构体类型,fp就是我们定义的文件指针变量。

2. 文件的打开方法、文件打开函数返回值的处理

文件打开函数 - fopen()

在 C 语言中,使用fopen()函数来打开文件。其基本语法如下:

FILE *fopen(const char *filename, const char *mode);
  • filename是要打开的文件的名称(包括路径,如果文件不在当前目录下)。例如:"data.txt"或者"C:/myfiles/data.bin"
  • mode是打开文件的模式,不同的模式决定了文件的操作方式,常见的模式如下:
    • 文本文件模式
      • "r":以只读方式打开文件,文件必须存在。
      • "w":以只写方式打开文件,如果文件存在则清空内容,如果文件不存在则创建新文件。
      • "a":以追加方式打开文件,在文件末尾添加内容,如果文件不存在则创建新文件。
      • "r+":以读写方式打开文件,文件必须存在。
      • "w+":以读写方式打开文件,先清空文件内容(如果存在)或创建新文件。
      • "a+":以读写方式打开文件,追加模式,文件不存在则创建。
    • 二进制文件模式:在上述模式字符串后添加"b",如"rb""wb""ab"等,表示以二进制方式操作文件。
文件打开函数返回值的处理

fopen()函数返回一个FILE *类型的指针,如果成功打开文件,则返回指向该文件的指针;如果打开文件失败,则返回NULL。因此,在打开文件后,应该检查返回值,以确保文件打开成功。例如:

#include <stdio.h>
#include <stdlib.h>int main() {FILE *fp;fp = fopen("test.txt", "r");if (fp == NULL) {perror("打开文件失败");return EXIT_FAILURE;}// 文件操作...fclose(fp);return 0;
}

在这个示例中,如果fopen()返回NULL,使用perror()函数输出错误信息,并返回EXIT_FAILURE表示程序执行失败。

3. 在程序中读写外部的文本文件或者二进制文件的方法

文本文件的读写
  • 读文本文件 - fgets()fscanf()函数
    • fgets()函数:用于从文件中读取一行字符串。其语法如下:
char *fgets(char *str, int n, FILE *stream);

str是存储读取字符串的字符数组,n是最多读取的字符数(包括'\0'),stream是文件指针。例如:

#include <stdio.h>
#include <stdlib.h>int main() {FILE *fp = fopen("text.txt", "r");if (fp == NULL) {perror("打开文件失败");return EXIT_FAILURE;}char line[100];while (fgets(line, 100, fp)!= NULL) {printf("%s", line);}fclose(fp);return 0;
}
- **`fscanf()`函数**:类似于`scanf()`,但用于从文件中读取格式化数据。例如:
#include <stdio.h>
#include <stdlib.h>struct Student {char name[20];int age;
};int main() {FILE *fp = fopen("students.txt", "r");if (fp == NULL) {perror("打开文件失败");return EXIT_FAILURE;}struct Student student;while (fscanf(fp, "%s %d", student.name, &student.age)!= -1) {printf("姓名: %s, 年龄: %d\n", student.name, student.age);}fclose(fp);return 0;
}
  • 写文本文件 - fputs()fprintf()函数
    • fputs()函数:用于向文件中写入一个字符串(不自动添加'\0')。其语法如下:
int fputs(const char *str, FILE *stream);

例如:

#include <stdio.h>
#include <stdlib.h>int main() {FILE *fp = fopen("output.txt", "w");if (fp == NULL) {perror("打开文件失败");return EXIT_FAILURE;}char str[] = "这是要写入文件的内容";fputs(str, fp);fclose(fp);return 0;
}
- **`fprintf()`函数**:类似于`printf()`,但用于向文件中写入格式化数据。例如:
#include <stdio.h>
#include <stdlib.h>struct Student {char name[20];int age;
};int main() {FILE *fp = fopen("students_info.txt", "w");if (fp == NULL) {perror("打开文件失败");return EXIT_FAILURE;}struct Student student = {"张三", 20};fprintf(fp, "姓名: %s, 年龄: %d\n", student.name, student.age);fclose(fp);return 0;
}
二进制文件的读写
  • 读二进制文件 - fread()函数
    fread()函数用于从文件中读取二进制数据。其语法如下:
size_t fread(void *ptr, size_t size, size_t count, FILE *stream);

ptr是存储读取数据的内存地址,size是每个数据元素的大小,count是要读取的元素个数,stream是文件指针。例如,读取一个包含整数的二进制文件:

#include <stdio.h>
#include <stdlib.h>int main() {FILE *fp = fopen("data.bin", "rb");if (fp == NULL) {perror("打开文件失败");return EXIT_FAILURE;}int buffer[10];size_t elements_read = fread(buffer, sizeof(int), 10, fp);printf("成功读取 %zu 个整数\n", elements_read);for (int i = 0; i < elements_read; i++) {printf("%d ", buffer[i]);}fclose(fp);return 0;
}
  • 写二进制文件 - fwrite()函数
    fwrite()函数用于向文件中写入二进制数据。其语法如下:
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);

例如,将一个整数数组写入二进制文件:

#include <stdio.h>
#include <stdlib.h>int main() {int data[] = {1, 2, 3, 4, 5};FILE *fp = fopen("output.bin", "wb");if (fp == NULL) {perror("打开文件失败");return EXIT_FAILURE;}size_t elements_written = fwrite(data, sizeof(int), 5, fp);printf("成功写入 %zu 个整数\n", elements_written);fclose(fp);return 0;
}

通过上述方法,可以在 C 程序中方便地对文本文件和二进制文件进行读写操作,实现数据的存储和读取。同时,注意在操作完文件后,使用fclose()函数关闭文件,释放相关资源。

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

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

相关文章

KPRCB结构之ReadySummary和DispatcherReadyListHead

ReadySummary: Uint4B DispatcherReadyListHead : [32] _LIST_ENTRY 请参考 _KTHREAD *__fastcall KiSelectReadyThread(ULONG LowPriority, _KPRCB *Prcb)

【染色时间】

题目 代码 #include <bits/stdc.h> using namespace std; #define x first #define y second typedef pair<int,int> PII; const int N 510; int dx[] {0,0,-1,1}, dy[] {-1,1,0,0}; int d[N][N], w[N][N]; int n, m; void bfs() {memset(d, 0x3f, sizeof d);q…

了解神经网络中的激活函数

一、激活函数的特征 非线性&#xff0c;激活函数必须是非线性函数。可微性&#xff0c;训练网络模型时&#xff0c;基于梯度的模型最优化方法要求激活函数必须是可导的。单调性&#xff0c;单调递增或单调递减&#xff0c;单调函数保证模型的简单。隐藏层一般需要使用激活函数…

Apache Dubbo (RPC框架)

本文参考官方文档&#xff1a;Apache Dubbo 1. Dubbo 简介与核心功能 Apache Dubbo 是一个高性能、轻量级的开源Java RPC框架&#xff0c;用于快速开发高性能的服务。它提供了服务的注册、发现、调用、监控等核心功能&#xff0c;以及负载均衡、流量控制、服务降级等高级功能。…

利用钉钉与金蝶云星空进行付款单自动化集成

钉钉数据集成到金蝶云星空&#xff1a;付款申请单下推生成付款单的技术实现 在企业日常运营中&#xff0c;数据的高效流转和准确处理是业务顺利进行的关键。本文将分享一个具体的系统对接集成案例&#xff1a;如何将钉钉平台上的付款申请单&#xff0c;通过轻易云数据集成平台…

前端八股文第七篇

61. React 中有对状态管理做进一步封装吗 在 React 中&#xff0c;除了可以使用原生的状态管理方式&#xff08;即使用组件的 state 属性&#xff09;外&#xff0c;还有一些第三方库对状态管理进行了进一步封装&#xff0c;以提供更强大和便捷的状态管理功能。其中最常见的是…

青少年编程能力等级测评CPA Python编程(一级)

青少年编程能力等级测评CPA Python编程(一级) &#xff08;考试时间90分钟&#xff0c;满分100分&#xff09; 一、单项选择题&#xff08;共20题&#xff0c;每题3.5分&#xff0c;共70分&#xff09; 下列语句的输出结果是&#xff08; &#xff09;。 print(35*2) A&a…

JavaScript语法基础(函数,对象,常用类Array,String,Math和Date)【超详细!!!新手入!!!】

一、函数 1、函数的定义 函数指的是一段可被重复调用的代码块。函数与变量不同&#xff0c;需要先定义再调用。 定义函数的语法格式为&#xff1a; function 函数名&#xff08;参数1&#xff0c;参数2&#xff0c;...&#xff09; { 语句&#xff1b; …

每日OJ题_牛客_NC6二叉树中的最大路径和_树形DP_C++_Java

目录 牛客_NC6二叉树中的最大路径和_树形DP 题目解析 C代码 Java代码 牛客_NC6二叉树中的最大路径和_树形DP 二叉树中的最大路径和_牛客题霸_牛客网 (nowcoder.com) 描述&#xff1a; 二叉树里面的路径被定义为:从该树的任意节点出发&#xff0c;经过父>子或者子>…

PG数据库 jsonb字段 模糊查询

背景&#xff1a; 项目由于多语言的设计&#xff0c;将字段设置成json字段类型&#xff0c;同时存储中文和英文 页面上通过输入框实现模糊的查询 一、表结构&#xff1a;name字段设置jsonb类型 二、表数据 3、Mybatis编写sql select pp.name ->>zh-CN as pmsProductNam…

啊手动阀示范点

1、阿发是否 2、撒阿斯顿发生 目录 1、阿发是否 2、撒阿斯顿发生

黑龙江某涝区泵闸站自动化、信息化改造项目案例

项目背景 黑龙江某地区紧邻松花江&#xff0c;雨季时降雨量增大&#xff0c;排水渠水位上涨&#xff0c;如果出现排涝不及时&#xff0c;水位过高时会漫入周边农田&#xff0c;引发洪涝灾害&#xff0c;对作物生长造成重大损害。为应对这一问题&#xff0c;自今年起&#xff0c…

奥数与C++小学四年级(第十八题 小球重量)

参考程序代码&#xff1a; #include <iostream> #include <vector>int main() {// 小球的重量std::vector<int> weights {1, 2, 3, 4, 5};// 用来存储可能的结果int a, b, c, d, e, x;// 穷举所有可能的 a, b, c, d, e 的组合for (int i 0; i < weight…

建筑行业知识库搭建:好处、方法与注意事项

在建筑行业&#xff0c;知识管理对于提升项目效率、降低成本、增强创新能力以及构建竞争优势具有至关重要的作用。搭建一个高效、系统的建筑行业知识库&#xff0c;不仅有助于实现知识的有效沉淀与便捷共享&#xff0c;还能促进知识在项目实践中的灵活应用&#xff0c;从而加速…

openCV基础-图像预处理Day26

图像预处理 ​ 在计算机视觉和图像处理领域&#xff0c;图像预处理是一个重要的步骤&#xff0c;它能够提高后续处理&#xff08;如特征提取、目标检测等&#xff09;的准确性和效率。OpenCV 提供了许多图像预处理的函数和方法&#xff0c;以下是一些常见的图像预处理操作&…

2.WebSocket进阶: 深入探究实时通信的最佳实践与优化技巧

系列目录 1.探索WebSocket&#xff1a;实时网络的心跳&#xff01; 序言 WebSocket作为Web实时通信的重要技术&#xff0c;广泛应用在需要快速响应的应用场景中&#xff0c;比如实时游戏、金融行情、在线聊天等。在基础理解上&#xff0c;我们知道WebSocket实现了客户端与服…

控制器一些不常用的的功能说明

1、IIC的特殊功能 1.1、IIC的10bit设备地址 10bit地址格式与7bit地址不同&#xff0c;分发送方向和接收方向。 1.1.1、发送方向 第一个字节的前7位是1111 0XX&#xff1a;XX是10bit地址的最高有效位的前两位 第一个字节的第8bit是读写位&#xff1a;决定传输方向 第二个字节…

git创建分支、删除分支、推送分支到远程等操作

git创建本地分支(不切换) git branch new-branch 切换到新的分支 git checkout new-branch git删除本地分支 git branch -d new-branch git branch -D new-branch(强制删除) 将本地分支推送到远程 git push origin new-branch 删除远程分支 git push origin --delete new-b…

ssm+vue657基于spring和vue开发的web新闻流媒体平台

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…

[Web安全 网络安全]-学习视频分享汇总(持续更新中)

文章目录&#xff1a; 一&#xff1a;工具 Burp Suite 二&#xff1a;数据库 三&#xff1a;前端 1.HTMLCSSJS 2.PHP 四&#xff1a;全套视频 五&#xff1a;分散视频 1.SQL注入漏洞 2.文件漏洞 2.1 文件上传 2.2 文件包含 2.3 文件下载 3.XSS漏洞 4.CSRF漏洞 …