深入理解C语言文件操作

目录:

  • 一、为什么使用文件?
  • 二、什么是文件?
  • 三、文件的打开和关闭
    • 1. 文件指针
    • 2. 文件的打开和关闭
  • 四、文件的顺序读写
  • 五、fseek函数
  • 六、ftell函数
  • 七、rewind函数
  • 八、文本文件和二进制文件
  • 九、文件读取结束的判定
  • 十、文件缓冲区
  • 文件函数的参数和使用方法
    • 1. `fopen` 函数
    • 2. `fclose` 函数
    • 3. `fprintf` 函数
    • 4. `fscanf` 函数
    • 5. `fgets` 函数
    • 6. `fputs` 函数
    • 7. `fseek` 函数
    • 8. `ftell` 函数
    • 9. `rewind` 函数
    • 10. `fwrite` 函数
    • 11. `fread` 函数
    • 12. `feof` 函数
    • 13. `setvbuf` 函数
  • 总结

一、为什么使用文件?

在编程中,文件操作是不可或缺的一部分。文件可以用于持久化存储数据,使得数据在程序运行结束后仍然可以被保存和读取。无论是配置文件、日志文件还是用户数据,文件操作都为我们提供了灵活且强大的数据管理方式。(以下代码有什么文件函数不懂的,下面有详细的讲解)

二、什么是文件?

文件是存储在外部存储介质(如硬盘、U盘等)上的一组相关数据的集合。在C语言中,文件可以分为以下几类:

  1. 程序文件:包含程序源代码的文件,如 .c 文件。
  2. 数据文件:用于存储程序运行时产生的数据,如日志文件、配置文件等。
  3. 文件名:文件的唯一标识符,通常由文件名和扩展名组成,如 data.txt

三、文件的打开和关闭

1. 文件指针

在C语言中,文件操作通过文件指针(FILE*)进行。文件指针是一个指向文件结构体的指针,用于管理文件的读写操作。

FILE *fp;

2. 文件的打开和关闭

文件的打开和关闭是文件操作的基本步骤。使用 fopen 函数打开文件,使用 fclose 函数关闭文件。

#include <stdio.h>int main() {FILE *fp;fp = fopen("example.txt", "w"); // 以写入模式打开文件if (fp == NULL) {printf("文件打开失败\n");return 1;}// 文件操作fclose(fp); // 关闭文件return 0;
}

四、文件的顺序读写

文件的顺序读写是指按照文件内容的顺序进行读取或写入操作。常用的函数包括 fprintffscanffgetsfputs

#include <stdio.h>int main() {FILE *fp;fp = fopen("example.txt", "w");if (fp == NULL) {printf("文件打开失败\n");return 1;}fprintf(fp, "Hello, World!\n"); // 写入文件fclose(fp);fp = fopen("example.txt", "r");if (fp == NULL) {printf("文件打开失败\n");return 1;}char buffer[100];fgets(buffer, 100, fp); // 读取文件printf("%s", buffer);fclose(fp);return 0;
}

五、fseek函数

fseek 函数用于移动文件指针到指定位置。它常用于随机访问文件内容。

#include <stdio.h>int main() {FILE *fp;fp = fopen("example.txt", "w+");if (fp == NULL) {printf("文件打开失败\n");return 1;}fprintf(fp, "Hello, World!\n");fseek(fp, 0, SEEK_SET); // 将文件指针移动到文件开头char buffer[100];fgets(buffer, 100, fp);printf("%s", buffer);fclose(fp);return 0;
}

六、ftell函数

ftell 函数用于获取当前文件指针的位置。

#include <stdio.h>int main() {FILE *fp;fp = fopen("example.txt", "w+");if (fp == NULL) {printf("文件打开失败\n");return 1;}fprintf(fp, "Hello, World!\n");long pos = ftell(fp); // 获取当前文件指针位置printf("当前文件指针位置: %ld\n", pos);fclose(fp);return 0;
}

七、rewind函数

rewind 函数用于将文件指针重置到文件开头。

#include <stdio.h>int main() {FILE *fp;fp = fopen("example.txt", "w+");if (fp == NULL) {printf("文件打开失败\n");return 1;}fprintf(fp, "Hello, World!\n");rewind(fp); // 将文件指针重置到文件开头char buffer[100];fgets(buffer, 100, fp);printf("%s", buffer);fclose(fp);return 0;
}

八、文本文件和二进制文件

C语言支持两种文件类型:文本文件和二进制文件。文本文件以字符形式存储数据,而二进制文件以二进制形式存储数据。

#include <stdio.h>int main() {FILE *fp;fp = fopen("example.bin", "wb"); // 以二进制写入模式打开文件if (fp == NULL) {printf("文件打开失败\n");return 1;}int data = 12345;fwrite(&data, sizeof(int), 1, fp); // 写入二进制数据fclose(fp);fp = fopen("example.bin", "rb"); // 以二进制读取模式打开文件if (fp == NULL) {printf("文件打开失败\n");return 1;}int read_data;fread(&read_data, sizeof(int), 1, fp); // 读取二进制数据printf("读取的数据: %d\n", read_data);fclose(fp);return 0;
}

九、文件读取结束的判定

在文件读取过程中,使用 feof 函数判断文件是否读取结束。需要注意的是,feof 函数在文件读取结束时返回非零值,但在读取错误时也会返回非零值。

#include <stdio.h>int main() {FILE *fp;fp = fopen("example.txt", "r");if (fp == NULL) {printf("文件打开失败\n");return 1;}char buffer[100];while (fgets(buffer, 100, fp) != NULL) {printf("%s", buffer);}if (feof(fp)) {printf("文件读取结束\n");} else {printf("文件读取错误\n");}fclose(fp);return 0;
}

十、文件缓冲区

文件缓冲区是操作系统用于提高文件读写效率的一种机制。C语言提供了 setvbuf 函数来设置文件缓冲区。

#include <stdio.h>int main() {FILE *fp;fp = fopen("example.txt", "w");if (fp == NULL) {printf("文件打开失败\n");return 1;}char buffer[1024];setvbuf(fp, buffer, _IOFBF, 1024); // 设置文件缓冲区fprintf(fp, "Hello, World!\n");fclose(fp);return 0;
}

文件函数的参数和使用方法

1. fopen 函数

FILE *fopen(const char *filename, const char *mode);
  • filename:文件名,可以是相对路径或绝对路径。
  • mode:文件打开模式,如 "r"(只读)、"w"(写入,文件不存在则创建)、"a"(追加)等。

2. fclose 函数

int fclose(FILE *stream);

stream:文件指针。

3. fprintf 函数

int fprintf(FILE *stream, const char *format, ...);
  • stream:文件指针。
  • format:格式化字符串。
  • ...:可变参数列表。

4. fscanf 函数

int fscanf(FILE *stream, const char *format, ...);
  • stream:文件指针。
  • format:格式化字符串。
  • ...:可变参数列表。

5. fgets 函数

char *fgets(char *str, int n, FILE *stream);
  • str:存储读取内容的字符串。
  • n:最大读取字符数。
  • stream:文件指针。

6. fputs 函数

int fputs(const char *str, FILE *stream);
  • str:要写入的字符串。
  • stream:文件指针。

7. fseek 函数

int fseek(FILE *stream, long offset, int origin);
  • stream:文件指针。
  • offset:偏移量。
  • origin:起始位置,如 SEEK_SET(文件开头)、SEEK_CUR(当前位置)、SEEK_END(文件末尾)。

8. ftell 函数

long ftell(FILE *stream);
  • stream:文件指针。

9. rewind 函数

void rewind(FILE *stream);
  • stream:文件指针。

10. fwrite 函数

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  • ptr:要写入的数据指针。
  • size:每个数据项的大小。
  • nmemb:数据项的数量。
  • stream:文件指针。

11. fread 函数

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
  • ptr:存储读取数据的指针。
  • size:每个数据项的大小。
  • nmemb:数据项的数量。
  • stream:文件指针。

12. feof 函数

int feof(FILE *stream);
  • stream:文件指针。

13. setvbuf 函数

int setvbuf(FILE *stream, char *buf, int mode, size_t size);
  • stream:文件指针。
  • buf:缓冲区指针。
  • mode:缓冲模式,如 _IOFBF(全缓冲)、_IOLBF(行缓冲)、_IONBF(无缓冲)。
  • size:缓冲区大小。

总结

C语言的文件操作提供了丰富的功能,从文件的打开和关闭到文件的读写,再到文件指针的移动和缓冲区的设置,每一步都为程序员提供了灵活且强大的工具。通过深入理解这些操作,我们可以更好地管理和处理文件数据,从而提高程序的效率和可靠性。此时,我们的C语言之旅就到此结束了,大家可以持续关注数据结构等专栏。

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

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

相关文章

基于uniapp+django微信小程序 食品安全信息管理系统

目录 项目介绍具体实现截图开发者工具介绍技术路线性能/安全/负载方面开发语言以及框架介绍python-flask核心代码部分展示python-django核心代码部分展示详细视频演示源码获取 项目介绍 食品安全信息管理系统设计的目的是为用户提供食品信息、科普专栏、食品检测、检测结果、交…

Chromium 中js Fetch API接口c++代码实现(二)

Chromium 中JavaScript Fetch API接口c代码实现&#xff08;一&#xff09;-CSDN博客 接着上一篇继续介绍调用&#xff0c;上函数堆栈。 1、打开http://192.168.8.1/chfs/shared/test/test02.html 此标签进程ID12484&#xff0c; 2、打开vs附加上此进程ID12484 3、点击页面测…

Java--IO高级流

缓冲流 缓冲流,也叫高效流&#xff0c;是对4个基本的FileXxx 流的增强&#xff0c;所以也是4个流&#xff0c;按照数据类型分类&#xff1a; 字节缓冲流&#xff1a;BufferedInputStream&#xff0c;BufferedOutputStream 字符缓冲流&#xff1a;BufferedReader&#xff0c;Buf…

用友Yonbuilder 平台使用教程序

用友Yonbuilder 平台使用教程 目录概述需求&#xff1a; 设计思路实现思路分析 免费下载参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,c…

环形链表(c语言)

1.//环形链表 //输入&#xff1a;head [3,2,0,-4], pos 1 //输出&#xff1a;true //解释&#xff1a;链表中有一个环&#xff0c;其尾部连接到第二个节点。 //输入&#xff1a;head [1, 2], pos 0 //输出&#xff1a;true //解释&#xff1a;链表中有一个环&#xff0c;其…

【机器学习】线性回归算法简介 及 数学实现方法

线性回归 简介 利用 回归方程(函数) 对 一个或多个自变量(特征值)和因变量(目标值)之间 关系进行建模的一种分析方式。 数学公式&#xff1a; ℎ_(w) w_1x_1 w_2x_2 w_3x_3 … b w^Txb 概念 ​ 利用回归方程(函数) 对 一个或多个自变量(特征值)和因变量(目标值)之间 关…

AI先驱荣获2024诺贝尔物理学奖

瑞典皇家科学院10月8日宣布&#xff0c;将2024年诺贝尔物理学奖授予John J. Hopfield和Geoffrey E. Hinton&#xff0c;以表彰他们利用人工神经网络实现机器学习的奠基性发现和发明。 John J. Hopfield&#xff08;约翰J霍普菲尔德&#xff09;美国新泽西州普林斯顿大学 Geoff…

新型僵尸网络针对 100 个国家发起 30 万次 DDoS 攻击

近日&#xff0c;网络安全研究人员发现了一个名为 Gorilla&#xff08;又名 GorillaBot&#xff09;的新僵尸网络恶意软件家族&#xff0c;它是已泄露的 Mirai 僵尸网络源代码的变种。 网络安全公司 NSFOCUS 在上个月发现了这一活动&#xff0c;并称该僵尸网络在今年 9 月 4 日…

2024 Mysql基础与进阶操作系列之MySQL触发器详解(20)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]

欢迎各位彦祖与热巴畅游本人专栏与博客 你的三连是我最大的动力 以下图片仅代表专栏特色 [点击箭头指向的专栏名即可闪现] 专栏跑道一 ➡️ MYSQL REDIS Advance operation 专栏跑道二➡️ 24 Network Security -LJS ​ ​ ​ 专栏跑道三 ➡️HCIP&#xff1b;H3C-SE;CCIP——…

Elasticsearch、Kibana学习

系列文章目录 JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程&#xff1a;封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工…

ViT(Vision Transformer详解)

Transformer作为前沿的深度学习框架&#xff0c;带有多模态的特性&#xff0c;对于不同类型的输入数据&#xff0c;不管是文本还是图像均可进行处理&#xff0c;而ViT则是对于Transformer中的视觉方面&#xff08;也就是输入数据为图像&#xff09;的衍生物&#xff08;因Trans…

知识改变命运 数据结构【优先级队列(堆)】

优先级队列(堆&#xff09; 1&#xff1a;堆概念2&#xff1a;堆的创建(以小根堆为例)3&#xff1a;堆的插入与删除3.1 堆的插入3.2堆的删除 4&#xff1a;oj练习5&#xff1a;堆排序6接口介绍&#xff08;底层代码的查看&#xff09;6.1常用三种构造方法 前言&#xff1a;队列…

Hadoop的三种运行模式:单机模式、伪分布式模式和完全分布式模式

单机模式 单机模式是Hadoop最简单的运行模式。在单机模式下&#xff0c;所有Hadoop组件都运行在单个机器上&#xff0c;包括HDFS、MapReduce等。由于只有一个节点参与计算&#xff0c;单机模式适用于开发和测试阶段&#xff0c;不适合用于处理大规模数据。在单机模式下&#xf…

攻防世界----->Replace

前言&#xff1a;做题笔记。 下载 查壳。 upx32脱壳。 32ida打开。 先运行看看&#xff1a; 没有任何反应&#xff1f; 猜测又是 地址随机化(ASLR)---遇见过。 操作参考&#xff1a; 攻防世界----&#xff1e;Windows_Reverse1_dsvduyierqxvyjrthdfrtfregreg-CSDN博客 然后…

UGUI(现成组合控件)

Drop Down Scroll View Scroll Bar size是滚动条的填充程度 Slider 如果设置为静态&#xff0c;那么传入的值始终为自己设置的那个值 Input Field content type为standard时 可以设置line type&#xff0c; 只读不改&#xff0c;就是可以复制&#xff0c;但是你已经不能输入了…

使用.mdf及.ldf恢复SQL SERVER数据库

文章目录 [toc]1.使用.mdf和对应的.ldf文件恢复数据库1.1 将对应的.mdf和.ldf复制到SQL SERVER路径下1.2 打开SSMS 1.使用.mdf和对应的.ldf文件恢复数据库 1.1 将对应的.mdf和.ldf复制到SQL SERVER路径下 一般默认路径是&#xff1a;C:\Program Files\Microsoft SQL Server\MS…

YOLO11改进|注意力机制篇|引入MSCA注意力机制

目录 一、【MSCA】注意力机制1.1【MSCA】注意力介绍1.2【MSCA】核心代码 二、添加【MSCA】注意力机制2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【MSCA】注意力机制 1.1【MSCA】注意力介绍 下图是【MSCA】的结构图&#xff0c;让我…

easyconnect配置wireshark抓包

文章目录 概述过程配置Wireshark抓包 概述 过程 配置Wireshark抓包 首先需要配置虚拟网卡SangforVPN可被Wireshark识别 重启 sc stop npcap sc start npcap# 清空路由表 netsh int ipv4 reset # 查看路由表 route print

企业建站能带来些什么?2024外包建站公司哪家好

目的的话只有企业自己知道&#xff0c;但作用还是有很多的—— 1.塑造企业精神与文化-对内 企业内部不管是否真的存在企业精神和企业文化&#xff0c;在制作网站的过程中都会考虑到这方面的内容&#xff0c;因为这是企业网站内容中不可或缺的一部分。 在企业内部还不存在所谓…

Java中的冒泡排序法

冒泡排序 排序的介绍冒泡排序法代码实现 排序的介绍 冒泡排序法 代码实现 将五个无序&#xff1a;24&#xff0c;69&#xff0c;80&#xff0c;57&#xff0c;13使用冒泡排序法将其排成一个从小到大的有序数列 public class test{public static void main(String[] args){int a…