C语言文件操作学习笔记:从基础到实践

在C语言的知识体系中,文件操作是极为关键的一环,它赋予了程序存储和读取外部数据的能力,对于开发各类实用程序至关重要。近期,借助课程的学习,我对C语言文件操作进行了系统且深入的学习,下面将我的学习心得和收获进行分享。

目录

一、文件操作基础概念

(一)文件类型

(二)文件指针

二、文件的打开与关闭

三、文件的顺序读写

(一)字符读写

(二)文本行读写

(三)格式化读写

(四)二进制读写

四、文件的随机读写

(一) fseek 函数

(二) rewind 函数

(三) ftell 函数

五、学习感悟


一、文件操作基础概念

(一)文件类型

文件主要分为程序文件数据文件。程序文件涵盖了可执行代码等内容,是程序运行的基础;数据文件则肩负着存储程序运行时所需处理或读取的数据的重任,常见的有文本文件二进制文件文本文件以字符形式存储数据便于人类阅读和编辑二进制文件则以二进制格式存储在存储和读取特定数据结构时效率更高。

(二)文件指针

在C语言中, FILE* 类型的指针扮演着关键角色,它用于指向文件,是后续对文件进行各种操作的“桥梁”。例如:


 

cFILE* pf = fopen("data.txt", "r");

上述代码中, pf 就是指向名为 data.txt 文件的指针, "r" 表示以只读方式打开文件。通过这个指针,我们可以对文件进行读取、写入等一系列操作。


二、文件的打开与关闭

文件的打开和关闭是进行文件操作的基础步骤。打开文件使用 fopen 函数,若成功执行,该函数会返回文件指针;若失败,则返回 NULL 。因此,为了确保程序的健壮性,打开文件后必须进行错误判断。示例如下:


 

c#include <stdio.h>int main() {FILE* pf = fopen("test.txt", "w");if (pf == NULL) {perror("fopen");return 1;}// 文件操作代码fclose(pf);pf = NULL;return 0;}

关闭文件时,我们需要使用 fclose 函数,并将文件指针置为 NULL ,这样可以有效防止野指针的产生。另外,文件路径的指定方式有绝对路径和相对路径。绝对路径完整地指明了文件在系统中的位置,而相对路径则是相对于当前工作目录的位置描述,在实际应用中可根据具体情况灵活选择。


三、文件的顺序读写

(一)字符读写

 fgetc 函数用于从文件流中逐个读取字符, fputc 函数则用于向文件流中写入字符。以下是一个向文件写入26个英文字母的示例:


 

c#include <stdio.h>int main() {FILE* pf = fopen("data.txt", "w");if (pf == NULL) {perror("fopen");return 1;}for (int i = 'a'; i <= 'z'; i++) {fputc(i, pf);}fclose(pf);pf = NULL;return 0;}

读取文件中的字符示例:


 

c#include <stdio.h>int main() {FILE* pf = fopen("data.txt", "r");if (pf == NULL) {perror("fopen");return 1;}int ch;while ((ch = fgetc(pf)) != EOF) {printf("%c ", ch);}fclose(pf);pf = NULL;return 0;}

(二)文本行读写

 fgets 函数能够读取文本行,它会将读取到的内容存储到指定的字符数组中,并且会保留换行符(如果有)。 fputs 函数则用于输出文本行到文件或标准输出。示例如下:

c// 写入文本行#include <stdio.h>int main() {FILE* pf = fopen("test.txt", "w");if (pf == NULL) {perror("fopen");return 1;}char str[] = "Hello, world!\nThis is a test line.";fputs(str, pf);fclose(pf);pf = NULL;return 0;}


 

c// 读取文本行#include <stdio.h>int main() {FILE* pf = fopen("test.txt", "r");if (pf == NULL) {perror("fopen");return 1;}char buffer[100];while (fgets(buffer, sizeof(buffer), pf) != NULL) {printf("%s", buffer);}fclose(pf);pf = NULL;return 0;}

(三)格式化读写

 fscanf  fprintf 函数类似于我们熟悉的 scanf 和 printf 不同之处在于它们是针对文件流进行格式化的输入和输出操作。例如,向文件中格式化写入数据:


 

c#include <stdio.h>struct Student {char name[20];int age;};int main() {FILE* pf = fopen("students.txt", "w");if (pf == NULL) {perror("fopen");return 1;}struct Student s = {"Tom", 20};fprintf(pf, "Name: %s, Age: %d", s.name, s.age);fclose(pf);pf = NULL;return 0;}

从文件中格式化读取数据:


 

c#include <stdio.h>struct Student {char name[20];int age;};int main() {FILE* pf = fopen("students.txt", "r");if (pf == NULL) {perror("fopen");return 1;}struct Student s;fscanf(pf, "Name: %s, Age: %d", s.name, &s.age);printf("Read: Name - %s, Age - %d\n", s.name, s.age);fclose(pf);pf = NULL;return 0;}

(四)二进制读写

 fread 和 fwrite 函数用于对文件进行二进制形式的读写,这在处理诸如结构体等复杂数据结构时非常实用。例如,将结构体数据以二进制形式写入文件:

c#include <stdio.h>struct Point {int x;int y;};int main() {FILE* pf = fopen("points.bin", "wb");if (pf == NULL) {perror("fopen");return 1;}struct Point p = {10, 20};fwrite(&p, sizeof(struct Point), 1, pf);fclose(pf);pf = NULL;return 0;}

从二进制文件中读取数据:

c#include <stdio.h>struct Point {int x;int y;};int main() {FILE* pf = fopen("points.bin", "rb");if (pf == NULL) {perror("fopen");return 1;}struct Point p;fread(&p, sizeof(struct Point), 1, pf);printf("Read: x - %d, y - %d\n", p.x, p.y);fclose(pf);pf = NULL;return 0;}

四、文件的随机读写

(一) fseek 函数

 fseek 函数允许我们根据给定的偏移量和起始位置来灵活定位文件指针例如,将文件指针从文件末尾向后退3个字节:

#include <stdio.h>
int main() {FILE* pf = fopen("data.txt", "r+");if (pf == NULL) {perror("fopen");return 1;}fseek(pf, -3, SEEK_END);// 后续操作fclose(pf);pf = NULL;return 0;
}

(二) rewind 函数

 rewind 函数的作用十分简洁明了,它能让文件指针迅速回到文件的起始位置,这对于需要重新读取文件内容的场景非常方便。示例如下:

c#include <stdio.h>int main() {FILE* pf = fopen("data.txt", "r");if (pf == NULL) {perror("fopen");return 1;}// 读取部分内容// 让文件指针回到起始位置rewind(pf);fclose(pf);pf = NULL;return 0;}

(三) ftell 函数

 ftell 函数可以获取文件指针相对于起始位置的偏移量,这在需要了解当前读取或写入位置的情况下很有用。例如:

c#include <stdio.h>int main() {FILE* pf = fopen("data.txt", "r");if (pf == NULL) {perror("fopen");return 1;}// 读取一些数据fgetc(pf);long offset = ftell(pf);printf("Current offset: %ld\n", offset);fclose(pf);pf = NULL;return 0;}

五、学习感悟

通过这段时间对C语言文件操作内容的学习,我对文件操作有了更为全面和深入的认识。从最基础的文件打开与关闭,到多种类型的读写操作,再到随机读写的灵活运用,每一个知识点都相互关联,构成了一个完整的知识体系。

在实际编写代码的过程中,我也遇到了不少挑战。比如,由于对文件指针的使用不够熟练,导致程序出现错误;对某些读写函数的参数理解存在偏差,使得数据读写不符合预期。但通过不断地调试代码、查阅资料以及向老师和同学请教,这些问题都逐步得到了解决。

文件操作在实际项目中的应用场景极为广泛,无论是数据的持久化存储、配置文件的读取,还是日志文件的记录等,都离不开文件操作技术。因此,后续我还需要通过更多的实际项目和练习,来进一步熟练掌握这部分知识,提高自己在文件操作方面的编程能力,以便更好地应对未来开发工作中的各种需求。

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

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

相关文章

VLM-E2E:通过多模态驾驶员注意融合增强端到端自动驾驶

25年2月来自香港科大广州分校、理想汽车和厦门大学的论文“VLM-E2E: Enhancing End-to-End Autonomous Driving with Multimodal Driver Attention Fusion”。 人类驾驶员能够利用丰富的注意语义&#xff0c;熟练地应对复杂场景&#xff0c;但当前的自动驾驶系统难以复制这种能…

第十天-字符串:编程世界的文本基石

在编程的广阔领域中&#xff0c;字符串是极为重要的数据类型&#xff0c;它就像一座桥梁&#xff0c;连接着人类的自然语言和计算机能够理解与处理的数字信息。下面&#xff0c;让我们深入探索字符串的世界。 一、字符串简介 字符串是由零个或多个字符组成的有序序列&#xff…

《基于HarmonyOS NEXT API 12+,搭建新闻创作智能写作引擎》

在信息爆炸的时代&#xff0c;新闻行业对于内容生产的效率和质量有着极高的要求。AI技术的发展为新闻创作带来了新的变革契机&#xff0c;借助AI智能写作助手&#xff0c;新闻工作者可以快速生成新闻稿件的初稿&#xff0c;大大提高创作效率。本文将基于HarmonyOS NEXT API 12及…

基于STM32的环境监测系统(自制蓝牙APP)

目录 项目概述 实物图 演示视频 概述 硬件模块 原理图以及PCB 0.96寸OLED屏幕&#xff08;SSD1306&#xff09; CubeMX配置 初始化代码 MQ-2烟雾传感器 CubeMX配置 初始化代码 DHT11温湿度模块 驱动代码 HC-05蓝牙模块 CubeMX配置 ​编辑 空闲中断回调函数 有…

linux离线安装ollama并部署deepseek-r1模型 指南

这篇文章主要分为两部分&#xff1a; (1)离线环境下如何部署Ollama&#xff1b; (2)在离线环境下如何配置大模型&#xff0c;其中这一步又分为&#xff1a;  1)部署完整的deepseek大模型&#xff0c;如&#xff1a;deepseek-r1:32B;  2)部署蒸馏版模型&#xff0c;如&#xf…

坐标变换介绍与机器人九点标定的原理

【备注】本文的C#代码在下面链接中可以下载:Opencv的C#九点标定代码资源-CSDN文库 https://download.csdn.net/download/qq_34047402/90452336 一、坐标变换的介绍 1.绕原点旋转的坐标变换 一个点(x,y)绕原点旋转u度,其旋转后的坐标(x1,y1)如何计算? 2.绕任意点的坐标变…

大语言模型 智能助手——既能生成自然语言回复,又能在必要时调用外部工具获取实时数据

示例代码&#xff1a; import json from langgraph.graph import Graph, END,StateGraph from langchain_core.utils.function_calling import convert_to_openai_function from langchain_community.tools.openweathermap import OpenWeatherMapQueryRun from langchain_core…

FPGA学习(一)——DE2-115开发板编程入级

FPGA学习&#xff08;一&#xff09;——DE2-115开发板编程入级 一、实验目的 通过 1 位全加器的详细设计&#xff0c;深入掌握原理图输入以及 Verilog 的两种设计方法&#xff0c;熟悉 Quartus II 13.0 软件的使用流程&#xff0c;以及在 Intel DE2-115 开发板上的硬件测试过…

中间件专栏之MySQL篇——MySQL事务原理、锁机制分析

MySQL的事务性也是其重要特性之一。 什么是事务&#xff1a;事务的本质是并发控制的单元&#xff0c;是用户定义的一个操作序列。这些操作要么都做&#xff0c;要么都不做&#xff0c;是 一个不可分割的工作单位。 目的&#xff1a;事务的目的在于将数据库从一种一致性状态转…

机器学习的三个基本要素

机器学习的基本要素包括模型、学习准则&#xff08;策略&#xff09;和优化算法三个部分。机器学习方法之间的不同&#xff0c;主要来自其模型、学习准则&#xff08;策略&#xff09;、优化算法的不同。 模型 机器学习首要考虑的问题是学习什么样的模型&#xff08;Model&am…

集成方案 | Docusign 能与哪些应用程序集成?

如何实现 Docusign 与多种系统平台之间的高效集成&#xff1f; 在企业跨境签约场景中&#xff0c;员工常常需要在电子签系统与办公应用&#xff08;如钉钉、企业微信&#xff09;、CRM、ERP 等系统之间来回切换&#xff0c;手动上传合同、下载签署文件并同步数据。这种繁琐的操…

2025华为OD机试真题目录【E卷+A卷+B卷+C卷+D卷】持续收录中...

摘要 本专栏提供2025最新最全的华为OD机试真题库&#xff08;EABCD卷&#xff09;&#xff0c;包括100分和200分题型。题目包含题目描述、输入描述、用例、备注和解题思路、多种语言解法&#xff08;Java/JS/Py/C/C&#xff09;。希望小伙伴们认真学习、顺利通过。 声明 本专…

广域互联网关键技术详解(GRE/LSTP/IPsec/NAT/SAC/SPR)

《广域互联网关键技术详解》属于博主的“广域网”专栏&#xff0c;若想成为HCIE&#xff0c;对于广域网相关的知识需要非常了解&#xff0c;更多关于广域网的内容博主会更新在“广域网”专栏里&#xff0c;请持续关注&#xff01; 一.前言 广域互联技术纷杂多样&#xff0c;不…

AF3 _correct_post_merged_feats函数解读

AlphaFold3 msa_pairing 模块的 _correct_post_merged_feats 函数用于对合并后的特征进行修正,确保它们符合预期的格式和要求。这包括可能的对特征值进行调整或进一步的格式化,确保合并后的 FeatureDict 适合于后续模型的输入。 主要作用是: 在多链蛋白质 MSA(多序列比对)…

Docker 学习(三)——数据管理

容器中的管理数据主要有两种方式&#xff1a; 数据卷 &#xff08;Data Volumes&#xff09;&#xff1a; 容器内数据直接映射到本地主机环境&#xff1b; 数据 卷容器&#xff08; Data Volume Containers&#xff09;&#xff1a; 使用特定容器维护数据卷 1.数据卷 数据卷…

基于SSM+Vue+uniapp的考研交流(带商城)小程序+LW示例参考

系列文章目录 1.基于SSM的洗衣房管理系统原生微信小程序LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统LW参考示例 3.基于SpringBootVue的企业人事管理系统LW参考示例 4.基于SSM的高校实验室管理系统LW参考示例 5.基于SpringBoot的二手数码回收系统原生微信小程序LW参考示…

2025-03-04 学习记录--C/C++-PTA 练习5-3 字符金字塔

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 二、解题步骤 ⭐️ 第1步、把字符和一个空格看作整体&#xff0c;即"G_"&#xff1b; 第2步、外…

DeepSeek集成到VScode工具,让编程更高效

DeepSeek与VScode的强强联合&#xff0c;为编程效率树立了新标杆。 DeepSeek&#xff0c;一款卓越的代码搜索引擎&#xff0c;以其精准的索引和高速的检索能力&#xff0c;助力开发者在浩瀚的代码海洋中迅速定位关键信息。 集成至VScode后&#xff0c;开发者无需离开熟悉的编辑…

前端-css(预编译器sass)

1.sass(scss->sass第三代) Sass3 -> Scss(Sassy CSS),SCSS(Sassy CSS) 是 CSS 语法的扩展. 2.scss注释 Sass 支持标准的 CSS 多行注释 /* */&#xff0c;以及单行注释 //&#xff0c;前者会 被完整输出到编译后的 CSS 文件中&#xff0c;而后者则不会 3.scss定义变量 …

【计算机网络入门】初学计算机网络(十一)重要

目录 1. CIDR无分类编址 1.1 CIDR的子网划分 1.1.1 定长子网划分 1.1.2 变长子网划分 2. 路由聚合 2.1 最长前缀匹配原则 3. 网络地址转换NAT 3.1 端口号 3.2 IP地址不够用&#xff1f; 3.3 公网IP和内网IP 3.4 NAT作用 4. ARP协议 4.1 如何利用IP地址找到MAC地址…