【C语言】文件及文件操作详解(fseek,ftell,rwind)

news2024/9/24 18:10:02

目录

1. 为什么使用文件

2. 什么是文件

2.1 程序文件

2.2 数据文件

2.3 文件名

3. 二进制文件和文本文件

4. 文件的打开和关闭

4.1 流和标准流

4.1.1 流

4.1.2 标准流

4.2 文件指针

4.3 文件的打开和关闭

5. 文件的顺序读写

6.文件的随机读写

6.1 fseek

6.2 ftell

6.3 rewind


1. 为什么使用文件

如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件。

2. 什么是文件

磁盘上的文件是文件。

在程序设计中,我们谈到的文件一般有两种(从文件功能的角度来分类):程序文件、数据文件

2.1 程序文件

程序文件包括源程序文件(后缀为.c)、目标文件(Windows环境下后缀为.obj,linux环境下后缀为.0)、可执行程序(Windows环境下后缀为.exe)。

2.2 数据文件

文件中的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。

接下来我们讨论的就是数据文件。

2.3 文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。

文件名包含三部分:文件路径+文件名主干+文件后缀

例如:C:\code\example.txt

为了方便起见,文件标识通常被称为文件名。

注:文件名可以不包含后缀名,但是文件名中不能包含 :/、\、:、*、?、“、<、>、|

3. 二进制文件和文本文件

根据数据的组织形式,数据文件被称为文本文件二进制文件

数据在内存中以二进制的形式存储,如果不加转换地输出到外存的文件中,就是二进制文件

如果要求在外存上以ASCII码的形式存储,则需要在存储前进行转换。以ASCII字符的形式存储的文件就是文本文件

那么一个数据在文件中是如何存储的呢?

字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。

例如有整数10000,如果以ASCII形式输出到磁盘,则磁盘中占用5个字节(一个字符占一个字节),而以二进制形式输出,则在磁盘上只占4个字节(在VS2019上测试)。

4. 文件的打开和关闭

4.1 流和标准流

4.1.1 流

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,

可以把流想象成一个中转站,它能根据不同的外部设备读写的方式来进行相应的操作。

流是一种抽象,表示在其上执行输入和输出操作的设备。流基本上可以表示为无限长度字符的源或目标。

C程序针对文件、画面、键盘等的数据输⼊输出操作都是同流操作的。

一般情况下,我们要想向流里写数据,或者从流中读取数据,都是要打开流,然后操作。

4.1.2 标准流

在C语言程序启动时,会默认打开三个流:

·stdin——标准输入流,在大多数的环境中从键盘输入

·stdout——标准输出流,在大多数环境中输出到显示器界面

·stderr——标准错误流,在大多数环境中输出到显示器界面

默认打开这三个流之后,使用scanf、printf等函数就可以直接进行输入输出操作。

stdin、stdout、stderr三个流的类型是:FILE*,通常被称为文件指针。

C语言中,就是通过FILE*的文件指针来维护流的各种操作的。

4.2 文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件的状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的,该结构体变量是由系统声明的,取名FILE 。

在VS2019编译环境中提供的stdio.h头文件中,我们是看不到对文件类型的声明的:

    typedef struct _iobuf
    {
        void* _Placeholder;
    } 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指向某个文件的文件信息区(一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够间接找到与它关联的文件。

4.3 文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件

在编写程序的时候,在打开文件的同时,都会返回⼀个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。

ANSI C规定使用fopen函数来打开文件,fclose函数来关闭文件。

//打开文件
FILE * fopen ( const char * filename, const char * mode );
//If the file is successfully opened, the function returns a pointer to a FILE object that can be used to identify the stream on future operations.
//Otherwise, a null pointer is returned.
//关闭文件
int fclose ( FILE * stream );
//If the stream is successfully closed, a zero value is returned.
//On failure, EOF is returned.

mode表示文件的打开模式,有以下打开模式:

文件的使用方式含义若文件不存在
“r”(只读)打开文件进行读取操作。该文件必须存在出错
“w”(只写)为了写入数据,打开一个文本文件,如果已存在同名文件,则会丢弃其内容,并将该文件视为新的空文件。建立一个新的文件
“a”(追加)向文本文件尾添加数据建立一个新文件
“rb”(只读)为了读取数据,打开一个二进制文件出错
“wb”(只写)为了写入数据,打开一个二进制文件建立一个新文件
“ab”(追加)向一个二进制文件尾添加数据

建立一个新文件

“r+”(读写)为了读和写,打开一个文本文件出错
“w+”(读写)为了读和写,建立一个新文本文件建立一个新文件
“a+”(读写)打开一个文本文件,在文件尾读写建立一个新的文件
“rb+”(读写)为了读和写,打开一个二进制文件出错
“wb+”(读写)为了读和写,新建一个新的二进制文件建立一个新的文件
“ab+”(读写)打开一个二进制文件,在文件尾进行读和写

建立一个新文件

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

5. 文件的顺序读写

顺序读写函数介绍:

函数名功能适用范围
fgetc字符输入函数(一次读取一个字符)所有输入流
fputc字符输出函数(一次写一个字符)所有输出流
fgets文本行输入函数(一次读取一行数据)所有输入流
fputs文本行输出函数(一次写一行数据)所有输出流
fscanf格式化输入函数所有输出流
fprintf格式化输出函数所有输出流
fread二进制输入文件流
fwrite二进制输出文件流

6.文件的随机读写

6.1 fseek

根据文件指针的位置和偏移量来定位文件指针。

int fseek ( FILE * stream, long int offset, int origin );
//origin有三种
//SEEK_SET----Beginning of file
//SEEK_CUR----Current position of the file pointer
//SEEK_END----End of file *

/* fseek example */
#include <stdio.h>

int main ()
{
  FILE * pFile;
  pFile = fopen ( "example.txt" , "wb" );
  fputs ( "This is an apple." , pFile );
  fseek ( pFile , 9 , SEEK_SET );
  fputs ( " sam" , pFile );
  fclose ( pFile );
  return 0;
}

6.2 ftell

返回文件指针相对于起始位置的偏移量

//long int ftell ( FILE * stream );

/* ftell example : getting size of a file */
#include <stdio.h>

int main ()
{
  FILE * pFile;
  long size;

  pFile = fopen ("myfile.txt","rb");
  if (pFile==NULL) perror ("Error opening file");
  else
  {
    fseek (pFile, 0, SEEK_END);   // non-portable
    size=ftell (pFile);
    fclose (pFile);
    printf ("Size of myfile.txt: %ld bytes.\n",size);
  }
  return 0;
}

6.3 rewind

使文件指针的位置回到文件的起始位置

//void rewind ( FILE * stream );

/* rewind example */
#include <stdio.h>

int main ()
{
  int n;
  FILE * pFile;
  char buffer [27];

  pFile = fopen ("myfile.txt","w+");
  for ( n='A' ; n<='Z' ; n++)
    fputc ( n, pFile);
  rewind (pFile);
  fread (buffer,1,26,pFile);
  fclose (pFile);
  buffer[26]='\0';
  puts (buffer);
  return 0;
}

____________________

⭐感谢你的阅读,希望本文能够对你有所帮助。如果你喜欢我的内容,记得点赞关注收藏我的博客,我会继续分享更多的内容。⭐

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

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

相关文章

解决Keepalived “脑裂”(双VIP)问题

1. 检查广播情况 yum install tcpdump -y tcpdump -i ens33 vrrp -n master 192.168.80.130 与 backup: 192.168.80.131都在广播&#xff0c;正常情况下backup应该是不在广播的&#xff0c;所以可以判断存在防火墙屏蔽vrrp问题&#xff0c;需要设置VRRP过掉防火墙&#xff0…

浏览器常见问题及技巧总结-------( 更新中 )

浏览器常见问题及技巧总结 浏览器1 查找网页关键字2 如何利用技术下载网上图片3 百度搜索技巧 待续、更新中 浏览器 1 查找网页关键字 火狐firefox Ctrlf: 在网页中查找关键字2 如何利用技术下载网上图片 插件: 图片助手(但还是有水印, 比起原版的要差些)3 百度搜索技巧 1.…

SpringCloud gateway限流无效,redis版本低的问题

在使用springCloud gateway的限流功能的时候&#xff0c;配置RedisRateLimiter限流无效&#xff0c;后来发现是Redis版本过低导致的问题&#xff0c;实测 Redis版本为3.0.504时限流无效&#xff0c;改用7.0.x版本的Redis后限流生效。查了资料发现很多人都遇见过这个问题&#x…

【网站项目】314学生二手书籍交易平台

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

直流电压变送器更改从站地址

直流电压变送器采集模块转RS485修改地址 产品图片 产品说明书 修改从站地址 在串口助手上将默认的从站地址01h修改为0Bh 原从站地址&#xff1a;01h 修改参数&#xff1a;10h 通信参数允许修改寄存器&#xff1a;1b fe&#xff08;说明书里7166的十六进制&#xff09; 00 02…

c语言的数据结构:队列

1.队列存在的实现方式及其存在意义 1.1为什么队列使用单链表实现更好 动态内存分配&#xff1a;链表在C语言中通常使用动态内存分配&#xff0c;这意味着可以在运行时根据需要动态地添加或删除节点。这对于实现一个动态大小的队列非常有用&#xff0c;因为队列的大小可以在运…

Matlab在同一张图中如何加入多个图例

根据代码最终画出的图片如下&#xff1a; 其实原理很简单&#xff0c;就是在一张figure中画多个坐标轴&#xff0c;每个坐标轴都有对应的图例&#xff0c;之后再将多余坐标轴隐藏&#xff0c;只保留一个即可。 代码如下&#xff1a; clear all; close all;dd_linewidth 1;a …

2024广东水展即将开幕 | 聚焦净水行业热点抢占行业新机遇

2024广东水展即将开幕 | 聚焦净水行业热点抢占行业新机遇 随着消费升级和人们对环境健康的意识增强&#xff0c;人们除了关注净水产品的性能外&#xff0c;对产品的设计、服务、多应用场景化等需求也愈发多样化。节能环保、智能化成为产品迭代升级主要方向。据奥维云网数据显示…

二叉搜索树的范围和(Lc938)——DFS

给定二叉搜索树的根结点 root&#xff0c;返回值位于范围 [low, high] 之间的所有结点的值的和。 示例 1&#xff1a; 输入&#xff1a;root [10,5,15,3,7,null,18], low 7, high 15 输出&#xff1a;32示例 2&#xff1a; 输入&#xff1a;root [10,5,15,3,7,13,18,1,nul…

分享Selenium测试工具用来模拟用户浏览器的操作

执行JS的类库&#xff1a;execjs&#xff0c;PyV8&#xff0c;selenium&#xff0c;node pip list pip install selenium pip install xlrd pip install xlwt pip install PyExecJS pip install xlutils selenium测试工具可以用来模拟用户浏览器的操作&#xff0c;其支持的浏览…

使用lnmp环境部署laravel框架需要注意的点

1&#xff0c;上传项目文件后&#xff0c;需要chmod -R 777 storage授予文件权限&#xff0c;不然会报错file_put_contents(/): failed to open stream: Permission denied。 如果后面还是报错没有权限的话&#xff0c;就执行ps -ef |grep php查询php运行用户。然后执行chown …

简单数据类型和复杂数据类型

1. 简单数据类型 null是个特例: 2. 复杂数据类型 3. 堆和栈 注意&#xff1a; JavaScript 中是没有堆和栈的概念的&#xff0c;通过堆栈的概念可以更好的理解代码的一些执行方式&#xff0c;便于将来学习其他语言。 4. 简单数据类型传参 总结&#xff1a;简单数据类型传参传…

7款炫酷的前端动画特效分享(二)(附效果图及在线演示)

分享7款好玩的前端动画特效 其中有CSS动画、SVG动画、js小游戏等等 下方效果图可能不是特别的生动 那么你可以点击在线预览进行查看相应的动画特效 同时也是可以下载该资源的 jQuery拉开帷幕特效 基于jQuery实现的帷幕特效 点击右侧拉条 可以实现帷幕的收起也展开 非常的炫酷…

【论文笔记】Dynamic Occupancy Grids for Object Detection: A Radar-Centric Approach

原文链接&#xff1a;https://arxiv.org/abs/2402.01488 I. 引言 感知环境在自动驾驶中非常重要&#xff0c;但传统的方法将这一过程分为两方面&#xff1a;动态物体的检测和跟踪&#xff0c;以及使用占用网格表达静态环境。占用网格难以表达高度动态的物体&#xff0c;因此动…

全国青少年软件编程(Python)等级考试试卷(一级) 测试卷2021年12月

第 1 题 【 单选题 】 下面程序的运行结果是什么&#xff1f;&#xff08; &#xff09; a10 b5 ca*b print(c) A :10 B :15 C :50 D :5 正确答案:C 试题解析: 第 2 题 【 单选题 】 与a>b and b>c等价的是&#xff1f;&#xff08; &#xff09; A…

第七十二天 漏洞发现-Web框架中间件联动GobyAfrogXrayAwvsVulmap

第72天 漏洞发现-Web框架中间件&联动&Goby&Afrog&Xray&Awvs&Vulmap 知识点&#xff1a; 1、Bup简单介绍&使用说明 2、Xray简单介绍&使用说明 3、AWWS简单介绍&使用说明 4、Goby简单介绍&使用说明 5、Afrog简单介绍&使用说明 6、…

关于编写测试用例的一些思考

测试用例是QA同学的基本功&#xff0c;每个人都有一套编写测试用例的体系&#xff0c;本文是作者结合自身的工作经验以及阅读一些测试相关的书籍后的一些看法&#xff0c;欢迎大家一起讨论学习。 测试设计 测试用例格式 面试中一些常见的问题 1.APP测试与服务端测试的区别&am…

【黑马程序员】5、TypeScript类型声明文件_黑马程序员前端TypeScript教程,TypeScript零基础入门到实战全套教程

课程地址&#xff1a;【黑马程序员前端TypeScript教程&#xff0c;TypeScript零基础入门到实战全套教程】 https://www.bilibili.com/video/BV14Z4y1u7pi/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 5、TypeScript类型声明文件 5.1 TS中的…

Ai-WB2-32S在window下使用vs 和 msys2编译以及烧录

文章目录 前言一、使用前准备第一步 安装vscode第二步 安装msys2 二、使用步骤1.打开MSYS2 MINGW64&#xff08;1&#xff09;在开始栏中找到MSYS2 MINGW64并打开&#xff08;2&#xff09;安装git&#xff08;3&#xff09;安装make&#xff08;4&#xff09;安装好之后的文件…

职场的过早优化

过早优化&#xff0c;指的是还没弄清楚需求未来的变化的走向的时候&#xff0c;忽略了更重要的问题。 放在职业发展上&#xff1a;你在没有积累足够职场资源&#xff08;眼界、能力、人脉等等&#xff09;&#xff0c;也没有对职业发展形成清晰认知的时候&#xff0c;就过早地进…