哲学家带你深♂入了解文件操作

目录

一、文件指针

二、文件的打开与关闭

 三、顺序读写函数的介绍

四、文件的随机读写

1、fseek

 2、ftell

3、rewind

总结

前言

c语言中的文件操作虽然不怎么常用但也是非常重要的知识,今天由本哲学家带大家深♂入了解c语言文件操作。

一、文件指针

每个被使用的文件都在内存中开辟了⼀个相应的文件信息区,用来存放文件的相关信息(如文件的名 字,文件状态及文件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系 统声明的,取名 FILE.
例如,VS2013 编译环境提供的 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* pf;//⽂件指针变量
定义pf是⼀个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是⼀个结构体变 量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够间接找到与它关联的文件。

二、文件的打开与关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。 在编写程序的时候,在打开文件的同时,都会返回⼀个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。
ANSI C 规定使用  fopen 函数来打开文件, fclose 来关闭文件。
//打开⽂件
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件
int fclose ( FILE * stream );

mode表示文件的打开模式,下面都是文件的打开模式:  

/* fopen fclose example */
#include <stdio.h>
int main ()
{FILE * pFile;//打开⽂件pFile = fopen ("myfile.txt","w");//⽂件操作if (pFile!=NULL){fputs ("fopen example",pFile);//关闭⽂件fclose (pFile);}return 0;
}

 三、顺序读写函数的介绍

其中只有fread和fwrite适用于文件流,其他的适用于所有流

这里我的理解:只是将从键盘上读取数据改成了从文件里读取数据,将数据打印在屏幕上改成了打印在文件内。

下面以fgetc和fputc为例子

#include <stdio.h>int main ()
{FILE *fp;int c;int n = 0;fp = fopen("file.txt","r");if(fp == NULL) {perror("打开文件时发生错误");return(-1);}do{c = fgetc(fp);if( feof(fp) ){break ;}printf("%c", c);}while(1);fclose(fp);return(0);
}

假设我们有一个文本文件 file.txt,它的内容如下。文件将作为实例中的输入:

We are in 2024

 让我们编译并运行上面的程序,这将产生以下结果:

We are in 2024
#include <stdio.h>int main ()
{FILE *fp;int ch;fp = fopen("file.txt", "w+");for( ch = 33 ; ch <= 100; ch++ ){fputc(ch, fp);}fclose(fp);return(0);
}

 让我们编译并运行上面的程序,这将在当前目录中创建文件 file.txt同时写入数据再退出程序,这样我们就能在 file.txt看见我们输入的东西。

四、文件的随机读写

1、fseek

函数声明:

int fseek(FILE *stream, long int offset, int whence)

C 库函数 int fseek(FILE *stream, long int offset, int whence) 设置流 stream 的文件位置为给定的偏移 offset,参数 offset 意味着从给定的 whence 位置查找的字节数。

  • stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
  • offset -- 这是相对 whence 的偏移量,以字节为单位。
  • whence -- 这是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一

 

示例

#include <stdio.h>int main ()
{FILE *fp;fp = fopen("file.txt","w+");fputs("This is runoob.com", fp);fseek( fp, 7, SEEK_SET );fputs(" C Programming Langauge", fp);fclose(fp);return(0);
}

让我们编译并运行上面的程序,这将创建文件 file.txt,它的内容如下。最初程序创建文件和写入 This is runoob.com,但是之后我们在第七个位置重置了写指针,并使用 puts() 语句来重写文件,内容如下:

This is C Programming Langauge

 2、ftell

函数声明:

long int ftell(FILE *stream)
返回文件指针相对于起始位置的偏移量
示例:
#include <stdio.h>int main ()
{FILE *fp;int len;fp = fopen("file.txt", "r");if( fp == NULL ) {perror ("打开文件错误");return(-1);}fseek(fp, 0, SEEK_END);len = ftell(fp);fclose(fp);printf("file.txt 的总大小 = %d 字节\n", len);return(0);
}

假设我们有一个文本文件 file.txt,它的内容如下:

This is runoob.com

让我们编译并运行上面的程序,如果文件内容如上所示,这将产生以下结果,否则会根据文件内容给出不同的结果:

file.txt 的总大小 = 19 字节

3、rewind

函数声明:

void rewind(FILE *stream)
返回文件指针相对于起始位置的偏移量
示例:
#include <stdio.h>int main()
{char str[] = "This is runoob.com";FILE *fp;int ch;/* 首先让我们在文件中写入一些内容 */fp = fopen( "file.txt" , "w" );fwrite(str , 1 , sizeof(str) , fp );fclose(fp);fp = fopen( "file.txt" , "r" );while(1){ch = fgetc(fp);if( feof(fp) ){break ;}printf("%c", ch);}rewind(fp);printf("\n");while(1){ch = fgetc(fp);if( feof(fp) ){break ;}printf("%c", ch);}fclose(fp);return(0);
}

假设我们有一个文本文件 file.txt,它的内容如下:

This is runoob.com

让我们编译并运行上面的程序,这将产生以下结果:

This is runoob.com
This is runoob.com

总结

文件的操作说白了就是将我们平时用的屏幕和键盘改成了文件而已,但数据可以的到更好的保存,期待下次和你们一起van♂。

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

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

相关文章

【python】深入探讨flask是如何预防CSRF攻击的

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

快排(六大排序)

快速排序 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff0c;其基本思想为&#xff1a;任取待排序元素序列中的某元素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子序列中所有元素均小于基准值&#xff0c;右子序列中所…

Doris实践——叮咚买菜基于OLAP引擎的应用实践

目录 前言 一、业务需求 二、选型与对比 三、架构体系 四、应用实践 4.1 实时数据分析 4.2 B端业务查询取数 4.3 标签系统 4.4 BI看板 4.5 OLAP多维分析 五、优化经验 六、总结 原文大佬介绍的这篇Doris数仓建设实践有借鉴意义的&#xff0c;这些摘抄下来用作沉淀学…

driver-class-name: com.mysql.jdbc.Driver爆红解决方式

文章目录 问题解决方式一:手动添加mysql的jar包 问题 问题&#xff1a;在springboot项目工程中想要进行数据库配置&#xff0c;在application.yml中添加以下代码&#xff1a; # 数据库配置 spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverusername: root #…

[每周一更]-第91期:认识AMD的CPU

这一章来认识下AMD,说起AMD&#xff0c;从我上大学那时候&#xff0c;就选购的AMD 速龙系列&#xff0c;生活拮据的情况下&#xff0c;拉着室友去郑州电子城&#xff0c;在跟奸商老板的拉扯下&#xff0c;斥资2000购入一个无显卡 的台式机&#xff08;实在是资金有限&#xff0…

蓝队面经(一)

蓝队面经(一) 文章目录 蓝队面经(一)入侵排查思路windows入侵排查思路Linux入侵排查思路 Linux 如何查看登录日志Windows 和 Linux 的日志文件放在哪里&#xff1f;WindowsLinux Linux 常用排查命令有哪些&#xff1f;Linux 的 Selinux 是什么&#xff1f;如何设置 Selinux&…

关系数据库理论

函数依赖: 关系数据库的规范化理论是数据库逻辑设计的工具。 关系模式由五部分组成&#xff0c;是一个五元组&#xff1a; R(U, D, DOM, F)  关系名 R 是符号化的元组语义  U 为一组属性  D 为属性组 U 中的属性所来自的域  DOM 为属性到域的映射  F 为属…

宝石 STL hash

发现可以O(N^2) 然后可以边做边处理两个宝石的乘积&#xff0c;然后另一个可以直接查hash #include<bits/stdc.h> using namespace std; using ll long long; using pii pair<int,int>; #define int long long const int N 1e510; const int inf 0x3f3f3f3f; …

43 带 fixed 列的 el-table 不兼容于 sortablejs

前言 这是一个基于 sortablejs 来实现的 el-table 的拖拽功能的基础实现 然后 这个过程中遇到的一个比较特殊的问题是, 关于 el-table-column 的 fixed 的属性, 对于 sortablejs 这边来定位目标选择列 影响的一个问题 在基础的用例中, 使用 “.el-table__body-wrapper tbo…

大数据学习-2024/3/29-oracle使用介绍

在plsql中登录ORACLE数据。 默认用户&#xff1a; 1、sys&#xff1a; 角色&#xff1a;数据库超级管理员账户。 权限&#xff1a;具有最高的权限&#xff0c;可以执行任何操作&#xff0c;包括操作数据字典和控制文件。可以创建和删除数据库对象&#xff0c;授予和回收其他用户…

SQLServer sys.default_constraints介绍

sys.default_constraints 是 SQL Server 的系统视图&#xff0c;它包含了数据库中所有默认约束的信息。默认约束是数据库对象&#xff08;如表中的列&#xff09;的约束&#xff0c;它为列定义了一个默认值&#xff0c;当在插入新行时没有为该列提供值时&#xff0c;将使用这个…

Python-基础部署

机器没法直接读懂我们写的代码&#xff0c;需要解释解释器作为中间的翻译&#xff0c;把代码转换成字节码在执行 安装python解释器 Download Python | Python.org 安装代码编辑器 pycharm Thank you for downloading PyCharm! 创建一个项目&#xff0c;每个项目里的文件夹…