初出茅庐的小李博客之C语言文件操作

C语言文件操作

在C语言中,文件操作主要是通过标准库函数来实现的。

今天有时间就来学习下一些常用的文件操作函数:

C 语言提供了一个 FILE 数据结构,记录了操作一个文件所需要的信息。该结构定义在头文件stdio.h,所有文件操作函数都要通过这个数据结构,获取文件信息。

struct _iobuf 
{char *_ptr;      // 指向缓冲区当前位置的指针int _cnt;        // 缓冲区中剩余的字节数char *_base;     // 指向缓冲区起始位置的指针int _flag;       // 文件状态标志(如错误、文件结束等)int _file;       // 文件描述符或句柄int _charbuf;    // 用于单字符缓冲int _bufsiz;     // 缓冲区大小char *_tmpfname; // 临时文件名指针(如果有)
};
typedef struct _iobuf FILE;  // 将结构体重命名为 FILE 类型

什么是文件指针:

开始操作一个文件之前,就要定义一个指向该文件的 FILE 指针,相当于获取一块内存区域,用来保存文件信息。

定义方式:

FILE* fp;

fopen()函数用来打开文件。所有文件操作的第一步,都是使用fopen()打开指定文件。这个函数的原型定义在头文件stdio.h

FILE* fopen(char* filename, char* mode);

它接受两个参数。第一个参数是文件名(可以包含路径),第二个参数是模式字符串,指定对文件执行的操作,比如下面的例子中,r表示以读取模式打开文件;

第一次运行如果没有这个文件,程序会提示错误。如下所示,所以要想以只读的形式打开这个文件那么这样文件要事先存在。我在桌面手动创建了这个文件。再次试验就可以成果打开。

第一次打开出错:
在这里插入图片描述

第二次打开正常:
在这里插入图片描述

打开文件之后我们试着用fread()来读取文件信息。

fread()函数用于一次性从文件读取较大的数据块,主要用途是将文件内容读入一个数组,适合读取二进制数据。它的原型定义在头文件stdio.h

size_t fread(void* ptr, size_t size,size_t nmemb,FILE* fp);

它接受四个参数

  • ptr:数组地址。
  • size:每个数组成员的大小,单位为字节。
  • nmemb:数组的成员数量。
  • fp:文件指针。

读取字节数可以用一个变量来接收,

// 从文件中读取数据
BytesRead = fread(buffer, sizeof(char), sizeof(buffer) - 1, fp);
printf("读到字节数BytesRead = %d\r\n",BytesRead);

在这里插入图片描述

读取数据时候有可能遇到文件为空的情况,这时候就需要检查是不是文件末尾。检查是否到文件末尾函数是feof

feof 是 C 标准库中的一个函数,用于检查文件是否已到达文件末尾(EOF,End of File)。它通常与文件读写函数(如 freadfgets 等)一起使用,以便在读取文件时检测到文件末尾。

feof 函数原型

int feof(FILE *stream);

参数解释

  • stream:指向 FILE 结构的文件指针。

返回值

  • 如果文件指针已到达文件末尾,则返回非零值 (真)。
  • 否则,返回零 (假)。

如果文本文件里面的内容是空的、那么读取到的数据字节数据应该是0。如图所示。

在这里插入图片描述

现在我试着网文件里写入一些信息。再尝试去读取信息

写入的信息是

This is a test txt.
Hello world!
end

编写读取数据到buffer的代码

    BytesRead = fread(buffer, sizeof(char), sizeof(buffer) - 1, fp);printf("读到字节数BytesRead = %d\r\n",BytesRead);if (BytesRead == 0){if (feof(fp))//文件到达末尾返回非零的真值 {printf("空文件、到达文件末尾\n");}else if (ferror(fp)){perror("没读到数据、读取文件时出错");}fclose(fp);return -1;}buffer[BytesRead] = '\0';printf("文件内容: %s\n", buffer);

读取信息入下所示:

打开文件时正常: No error
读到字节数BytesRead = 36
文件内容:
This is a test txt.
Hello world!
end
--------------------------------
Process exited after 0.04219 seconds with return value 0
请按任意键继续. . .

在这里插入图片描述

fclose 是 C 标准库中的一个函数,用于关闭已经打开的文件。关闭文件可以释放与该文件相关的资源,并确保所有缓冲区中的数据被写入文件。

fclose 函数原型

int fclose(FILE *stream);

参数解释

  • stream:指向 FILE 结构的文件指针,该文件指针指向要关闭的文件。

返回值

  • 如果成功关闭文件,返回0。
  • 如果发生错误,返回 EOF(通常为 -1)

完整的代码如下:

#include <stdio.h>int main(void)
{FILE *fp;         // 定义一个 FILE 类型的指针char buffer[256]; // 定义一个缓冲区用于存储读取的数据size_t BytesRead; // 定义读取到多少个字节// 打开一个文件用于读取fp = fopen("example.txt", "r");if (fp == NULL){perror("打开文件时出错");return -1;}else{printf("打开文件正常\r\n");}// 从文件中读取数据BytesRead = fread(buffer, sizeof(char), sizeof(buffer) - 1, fp);printf("读到字节数 BytesRead = %zu\r\n", BytesRead);if (BytesRead == 0){if (feof(fp)) // 文件到达末尾返回非零的真值{printf("空文件或到达文件末尾\r\n");}else if (ferror(fp)){perror("没读到数据,读取文件时出错");}fclose(fp);return -1;}// 为缓冲区添加字符串结束符buffer[BytesRead] = '\0';printf("文件内容:\r\n%s\r\n", buffer);// 关闭文件if (fclose(fp) == 0) // fclose 关闭成功返回0,关闭失败返回EOF{printf("成功关闭文件\r\n");}else{perror("关闭文件时出错");}return 0;
}

补充说明:EOF

C 语言的文件操作函数的设计是,如果遇到文件结尾,就返回一个特殊值。程序接收到这个特殊值,就知道已经到达文件结尾了。

头文件stdio.h为这个特殊值定义了一个宏EOF(end of file 的缩写),它的值一般是-1。这是因为从文件读取的二进制值,不管作为无符号数字解释,还是作为 ASCII 码解释,都不可能是负值,所以可以很安全地返回-1,不会跟文件本身的数据相冲突。

需要注意的是,不像字符串结尾真的存储了\0这个值,EOF并不存储在文件结尾,文件中并不存在这个值,完全是文件操作函数发现到达了文件结尾,而返回这个值。

fopen打开文件模式可能情况

以下是 fopen 函数的所有可能模式及其详细解释,包括注意事项:

模式模式说明文件指针位置文件存在文件不存在读操作写操作注意事项
r读模式文件开始读取文件返回 NULL允许不允许文件必须存在,否则返回 NULL。
w写模式文件开始文件内容被清空创建新文件不允许允许打开时会清空文件内容。
a追加写模式文件末尾文件末尾追加创建新文件不允许允许写操作总是在文件末尾。
r+读写模式文件开始读取和写入返回 NULL允许允许文件必须存在,否则返回 NULL。
w+读写模式文件开始文件内容被清空创建新文件允许允许打开时会清空文件内容。
a+读写模式文件末尾读取和追加创建新文件允许允许写操作总是在文件末尾。

注意事项

  1. r 模式

    • 只读模式,如果文件不存在,返回 NULL。因此在打开文件后,必须检查文件指针是否为 NULL
  2. w 模式

    • 只写模式,打开文件时会清空文件内容。如果文件不存在,则创建新文件。这种模式不允许读取文件内容。
  3. a 模式

    • 追加写模式,文件指针总是指向文件末尾。即使使用 fseek 移动文件指针,写入操作仍会在文件末尾。如果文件不存在,则创建新文件。这种模式不允许读取文件内容。
  4. r+ 模式

    • 读写模式,文件指针指向文件开始,允许读取和写入。如果文件不存在,返回 NULL。因此在打开文件后,必须检查文件指针是否为 NULL
  5. w+ 模式

    • 读写模式,打开文件时会清空文件内容,文件指针指向文件开始。如果文件不存在,则创建新文件。这种模式允许读取和写入,但注意文件内容会被清空。
  6. a+ 模式

    • 读写模式,文件指针指向文件末尾,允许读取和追加。如果文件不存在,则创建新文件。尽管可以读取文件内容,但写操作总是在文件末尾。

示例代码

以下是如何使用这些模式打开文件的示例代码:

#include <stdio.h>void open_file(const char *filename, const char *mode) 
{FILE *fp = fopen(filename, mode);if (fp == NULL) {perror("打开文件失败");return;}printf("以模式 '%s' 成功打开文件\r\n", mode);// 关闭文件if (fclose(fp) == 0) // fclose 关闭成功返回0,关闭失败返回EOF{printf("成功关闭文件\r\n");}else{perror("关闭文件时出错");}
}int main(void) 
{open_file("example_r.txt", "r");open_file("example_w.txt", "w");open_file("example_a.txt", "a");open_file("example_r+.txt", "r+");open_file("example_w+.txt", "w+");open_file("example_a+.txt", "a+");return 0;
}

上边代码运行后只会产生四个文件

在这里插入图片描述

在这里插入图片描述

有关文件操作的接口还有以下几个,如果大家感兴趣可以点个在看,我继续更新!

fwrite():写入文件

fseek():移动文件指针到指定位置

ftell():获取文件指针当前位置

fgetc():从文件中读取一个字符

fputc():写入一个字符到文件中

fscanf():从文件中读取格式化输入

fprintf():按格式写入到文件中

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

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

相关文章

python库(3):Cerberus库

1 Cerberus简介 Cerberus 是一个Python数据验证库&#xff0c;设计用于验证数据结构的有效性和一致性。它提供了一种简单而强大的方式来定义和应用验证规则&#xff0c;特别适用于处理用户输入的验证、配置文件的检查以及API的参数验证等场景。下面将详细介绍 Cerberus 的特点…

伦敦金价格走势图的资金管理怎么进行?

要成熟地交易伦敦金价格走势图&#xff0c;其实并不是一件容易的事情。其一&#xff0c;我们在很多广告或者周边朋友的宣传之下&#xff0c;觉得它能够帮助我们很快之内实现很多的财富增值&#xff0c;其二&#xff0c;很多投资者觉得伦敦金交易虽然不错&#xff0c;但是风险好…

对象被优化以后才是高效的C++编程

课程总目录 文章目录 一、对象会调用哪些方法、对象优化的三个原则二、CMyString的代码问题三、四、添加带右值引用参数的拷贝构造和赋值函数五、CMyString在vector上的应用六、move移动语义和forward类型完美转发七、再聊vector容器使用对象过程中的优化 一、对象会调用哪些方…

Python从0到100(三十六):字符和字符集基础知识及其在Python中的应用

1. 字符和字符集概述 字符(Character)是构成书面语言的基本元素&#xff0c;它包括但不限于各国家的文字、标点符号、图形符号和数字。字符集(Character set)则是一个包含多个字符的系统&#xff0c;用于统一管理和编码不同的字符。 常见字符集 ASCII&#xff1a;最早的字符…

SpringBoot 启动流程一

SpringBoot启动流程一 我们首先创建一个新的springboot工程 我们不添加任何依赖 查看一下pom文件 我们创建一个文本文档 记录我们的工作流程 我们需要的是通过打断点实现 我们首先看一下启动响应类 package com.bigdata1421.start_up;import org.springframework.boot.Spr…

音视频流媒体视频平台LntonAIServer视频监控平台工业排污检测算法

在当今社会&#xff0c;环境保护和可持续发展已成为全球关注的焦点。工业生产作为经济发展的重要支柱&#xff0c;其对环境的影响不容忽视。因此&#xff0c;如何有效地监控和管理工业排污&#xff0c;成为了一个亟待解决的问题。LntonAIServer工业排污检测算法应运而生&#x…

开发电商ERP系统需要接入哪些平台API?

跟随全渠道发展趋势&#xff0c;很多实体商家开设电商店铺&#xff0c;为消费者提供便捷的购物体验&#xff0c;增强消费者的满意度&#xff0c;同时也提升了企业自身的市场竞争力。为了满足商家业务拓展需求&#xff0c;很多原本主要服务于实体商贸企业的ERP服务商&#xff0c…

CSS filter(滤镜)属性,并实现页面置灰效果

目录 一、filter&#xff08;滤镜&#xff09;属性 二、准备工作 三、常用的filter属性值 1、blur(px) 2、brightness(%) 3、contrast(%) 4、grayscale(%) 5、opacity(%) 6、saturate(%) 7、sepia(%) 8、invert(%) 9、hue-rotate(deg) 10、drop-shadow(h-shadow v…

编译rust程序,并让它依赖低版本的GLIBC库

在linux环境下编译rust程序,编译好的程序会依赖你当前系统的GLIBC库,也就是说你的程序无法在使用更低版本GLIBC库的linux系统中运行。 查看当前系统的GLIBC版本: strings /lib64/libc.so.6 | grep GLIBC 为了让编译的程序依赖比较低版本的GLIBC库,我们最好在centos7下编译…

JavaScript基础-函数(完整版)

文章目录 函数基本使用函数提升函数参数arguments对象&#xff08;了解&#xff09;剩余参数(重点)展开运算符(...) 逻辑中断函数参数-默认参数函数返回值-return作用域(scope)全局作用域局部作用域变量的访问原则垃圾回收机制闭包 匿名函数函数表达式立即执行函数 箭头函数箭头…

【机器学习】Google开源大模型Gemma2:原理、微调训练及推理部署实战

目录 一、引言 二、模型简介 2.1 Gemma2概述 2.2 Gemma2 模型架构 三、训练与推理 3.1 Gemma2 模型训练 3.1.1 下载基座模型 3.1.2 导入依赖库 3.1.3 量化配置 3.1.4 分词器和模型实例化 3.1.5 引入PEFT进行LORA配置 3.1.6 样本数据清洗与加载 3.1.7 模型训练与保…

SCI一区TOP|徒步优化算法(HOA)原理及实现【免费获取Matlab代码】

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;SO Oladejo受到徒步旅行启发&#xff0c;提出了徒步优化算法&#xff08;Hiking Optimization Algorithm, HOA&#xff09;。 2.算法原理 2.1算法思想 HOA灵感来自于…

小试牛刀-Solana合约账户详解

目录 一.Solana 三.账户详解 3.1 程序账户 3.2 系统所有账户 3.3 程序派生账户(PDA) 3.4 Token账户 四、相关学习文档 五、在线编辑器 Welcome to Code Blocks blog 本篇文章主要介绍了 [Solana合约账户详解] ❤博主广交技术好友&#xff0c;喜欢文章的可以关注一下❤ …

【人工智能】--生成对抗网络

个人主页&#xff1a;欢迎来到 Papicatch的博客 课设专栏 &#xff1a;学生成绩管理系统 专业知识专栏&#xff1a; 专业知识 文章目录 &#x1f349;引言 &#x1f349;GAN 的基本原理 &#x1f348;生成器&#xff08;Generator&#xff09; &#x1f348;判别器&…

sql语句练习注意点

1、时间可以进行排序&#xff0c;也可以用聚合函数对时间求最大值max&#xff08;时间&#xff09; 例如下面的例子&#xff1a;取最晚入职的人&#xff0c;那就是将入职时间倒序排序&#xff0c;然后limit 1 表&#xff1a; 场景&#xff1a;查找最晚入职员工的所有信息 se…

Pinia:Vue 2 和 Vue 3 中更好用的状态管理框架

前言 还在用Vuex? 在Vue应用程序的开发过程中&#xff0c;高效且易于维护的状态管理一直是开发者关注的核心问题之一。随着Vue 3的发布&#xff0c;状态管理领域迎来了一位新星——Pinia&#xff0c;它不仅为Vue 3量身打造&#xff0c;同时也向下兼容Vue 2&#xff0c;以其简…

PostgreSQL 在Windows下保姆级图文安装教程

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 &#x1f913; 同时欢迎大家关注其他专栏&#xff0c;我将分享Web前后端开发、人工智能、机器学习、深…

The Plant Cell:DAP-seq技术助力揭示MdWRKY75调控苹果耐热性的分子机制

2024年6月12日&#xff0c;西北农林科技大学作物抗逆与高效生产全国重点实验室/园艺学院苹果抗逆与品质改良创新团队马锋旺教授/李超课题组在植物学知名期刊The Plant Cell&#xff08;影响因子10&#xff09;在线发表了题为“The MdHSC70-MdWRKY75 module mediates basal appl…

微信小程序 调色板

注意&#xff1a;是在uniapp中直接使用的一个color-picker插件&#xff0c;改一下格式即可在微信小程序的原生代码中使用 https://github.com/KirisakiAria/we-color-picker 这是插件的地址&#xff0c;使用的话先把这个插件下载下来&#xff0c;找到src&#xff0c;在项目创…

九、函数的声明和定义

函数声明&#xff1a; 1. 告诉编译器有一个函数叫什么&#xff0c;参数是什么&#xff0c;返回类型是什么。但是具体是不是存在&#xff0c;函数 声明决定不了。 2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。 3. 函数的声明一般要放在头文件中的。 定义的函…