C语言之详细讲解文件操作

什么是文件

与普通文件载体不同,文件是以硬盘为载体存储在计算机上的信息集合,文件可以是文本文档、图片、程序等等。文件通常具有点+三个字母的文件扩展名,用于指示文件类型(例如,图片文件常常以KPEG格式保存并且文件扩展名为.jpg)。

将数据放入文件中,相比代码程序中堆栈上的数据,其优点在于可以随时做到需要时添加、舍弃时删除,数据可以持久化。

文件类型:

一般分为:程序文件与数据文件。

程序文件:

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

数据文件:

文件的内容不一定是程序,而是程序运行中的读取的数据。本章讨论的是数据文件。


文件的使用

在了解文件怎样使用前,我们先要了解流与标准流的概念

程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。

这样程序员在输入输出数据时不需要关心外部设备了,只需要将数据与流相连,C语言底层已经将流向不同外部设备的输入和输出实现好了,不需要我们关心。

我们只需要从流里读取数据,向流里写数据。

标准流


那为什么我们从键盘输入数据,向屏幕上输出数据,并没有打开流呢?

那是因为C语言程序在启动时已经将标准流(standard stream)准备好了。

默认打开了3个流:

stdin-标准输入流,在大多数的环境中从键盘输入,scanf函数就是从stdin-标准输入流(键盘)中读取数据。

stdout-标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到stdout-标准输出流(屏幕)中。
stderr-标准错误流,大多数环境中输出到显示器界面。

stdin、 stdout、 stderr 三个流的类型是: FILE*,通常称为文件指针。
C语言中,就是通过 FILE*的文件指针来维护流的各种操作的。

文件的操作

文件操作分为三步:打开文件(fopen)、读取或写入文件、关闭文件(fclose)。

文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名 字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系 统声明的,取名FILE.
FILE*pf;//文件指针变量pf

定义一个指针变量指向FILE类型数据,可以使pf指向某个文件的文件信息区(是一个结构体变 量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够间接找到与它关联的文件

文件的打开与关闭

文件读写之前应该先打开文件,使用结束后应该关闭文件。
ANSIC 规定使用 fopen 函数来打开文件, fclose 函数来关闭文件。  

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

fopen() —— 打开文件;
FILE * fopen ( const char * filename, const char * mode );
fclose() —— 关闭文件;
int fclose ( FILE * stream );

例:

#include<stdio.h>
#include<assert.h>int main() {FILE* pr = fopen("test.txt","w");//当没有文件时读取,fopen输出NULL//当没有文件写入时,会自动创建文件assert(pr);//这里使用assert断言,以防pr为空,也可以使用perror函数for (char ch = 'a'; ch <= 'z'; ch++) {fputc(ch, pr);//fputc函数将字符ch存入pr文件中}fclose(pr);return 0;
}

文件的使用方式:

按常用序:

文件的顺序读写:

1.写入一个字符

fgetc(字符c,文件指针);

2.读取一个字符

fputc(文件指针);
//每一次读取光标回向后移动一位
例:test.txt文件里面:abcdefg
char ch=fputc(pr);
printf(%c,ch);//输出为a;
char ch=fputc(pr);
printf(%c,ch);//输出为b;

3.写入一个字符串

fgets("hello,world",文件指针);
//每次的写入会导致数据的覆盖,在原先的数据后继续添加,需要使用a(追加);

4.读取指定长度的数据(读取数组)

char arr[10]={0};
fgets(arr,5,文件指针);//将所读取的数据存入arr数组中

5.读取结构体指定数据(fprintf);

#include<stdio.h>typedef struct S//typdef,以便更好的创建结构体变量
{char name[10];int age;}S1;int main()
{FILE* pf = fopen("test.txt", "w");if (pf != NULL)//也可用assert函数判断是否为空{S1 s1 = { "zhangsan", 18 };//创建变量s1fprintf(pf, "%s %d\n", s1.name, s1.age);fclose(pf);pf = NULL;}return 0;
}

文件的随机读写

fseek函数

fseek - C++ 参考 (cplusplus.com)

ftell - C++ Reference

ferror - C++ Reference

int fseek ( FILE * stream, long int offset, int origin );
                          流                  偏移量           起始位置
流:指向标识流的 FILE 对象的指针。
偏移量:二进制文件:要从源偏移的字节数。文本文件:零或 ftell 返回的值。

如果成功,该函数将返回零。
否则,它将返回非零值。
如果发生读取或写入错误,则设置错误指示符 (ferror)。

三种定位指针

#include<stdio.h>int main()
{FILE* pFile;pFile = fopen("test.txt", "r");//fputs("This is an apple.", pFile);fseek(pFile,2, SEEK_SET);//从起始位置的第二个偏移量int ch = fgetc(pFile);printf("%c", ch);fclose(pFile);return 0;
}

注意:

ftell函数

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

long int ftell ( FILE * stream );//注:返回为long int类型
#include <stdio.h>
int main()
{int n;FILE* pFile;char buffer[27];pFile = fopen("test.txt", "w+");for (n = 'A'; n <= 'Z'; n++)fputc(n, pFile);//向文本中输入字符rewind(pFile);//让文件指针回到起始位置fread(buffer, 1, 26, pFile);//读取1到26个数据fclose(pFile);buffer[26] = '\0';printf(buffer);//验证return 0;
}

feof函数(文件读取结束的判定)

feof - C++ 参考 (cplusplus.com)

文本文件:

  • fgetc 判断是否为 EOF .
  • fgets 判断返回值是否为 NULL
二进制文件:

        都是使用 fread() 读取,要判断其返回值与指定读取个数的大小,如果小于实际要读的个数,就说明发生读取异常,如果等于实际要读的个数,就说明是因读取成功而结束;

对于读取异常的判断,我们考虑判断 ferror() 函数的返回值:

若ferrror()为真——异常读取而结束;
若feof()为真——正常读取到尾而结束;

二进制文件和文本文件
我们知道数据在内存中是以二进制形式存储的,对于文件而言:如果不加转换直接输出到外存就是二进制文件;如果要在外存上以ASCII码形式存储,就需要提前转换最后以ASCII码值形式存储的文件就是文本文件。

对于字符,一律使用ASCII码形式存储,但对于数值型数据,即可以使用ASCII码存储也可以使用二进制形式存储。


oi!点个赞走吧!!!

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

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

相关文章

第5篇:创建Nios II工程之Hello_World<四>

Q&#xff1a;最后我们在DE2-115开发板上演示运行Hello_World程序。 A&#xff1a;先烧录编译Quartus硬件工程时生成的.sof文件&#xff0c;在FPGA上成功配置Nios II系统&#xff1b;然后在Nios II Eclipse窗口右键点击工程名hello_world&#xff0c;选择Run As-->Nios II …

C#利用IDbCommand实现通用数据库脚本执行程序

目录 关于 ExecuteNonQuery 数据库脚本程序的执行流程 范例运行环境 通用类的设计 引用 DAL类 实现代码 小结 关于 ExecuteNonQuery 在.net 应用中&#xff0c;在数据库中执行脚本程序是经常用到的功能&#xff0c;如数据操作&#xff08;新增、修改、删除等&#xff0…

C语言趣味代码(四)

这一篇主要编写几个打字练习的小程序&#xff0c;然后通过这些小程序的实现来回顾复习我们之前学过的知识&#xff0c;然后通过这写打字练习的小程序来提升我们的打字技术和编程技术。 1. 打字练习 1.1 基本打字练习 1.1.1 基本实现 首先我们来制作一个用于计算并显示输入一…

github two-factor authentication是个啥?

最近在逛github时&#xff0c;总是时不时会弹出一下界面&#xff0c;很烦 看到红框里的文字&#xff0c;这明显是强制要求做这个认证&#xff0c;如果不认证4天后账号将不可访问&#xff0c;所以今天花点时间看看怎么做这个认证&#xff0c;点“Enable 2FA now”进入这个界面&a…

普通用户执行source报错,sudo: source:找不到命令的解决方案

一、问题描述 当修改/etc/profile文件&#xff08;环境变量&#xff09;后&#xff0c;想让该环境变量立刻生效。需要执行source命令。命令如下&#xff1a; sudo source /etc/profile 执行这个后&#xff0c;不像别人的执行成功&#xff0c;反而报错了。错误信息如下&#…

linux下安装anaconda

顺手点个关注吧&#xff0c;谢谢&#xff01; 一、下载安装包 https://repo.anaconda.com/archive/ 或者使用命令 wget https://repo.anaconda.com/archive/Anaconda3-5.3.1-Linux-x86_64.sh2.赋予权限并安装 # 给文件执行权限 chmod 777 Anaconda3-5.3.1-Linux-x86_64.sh# 执…

商汤研究院招大模型实习生

商汤研究院招大模型实习生&#xff0c;base上海、北京&#xff0c;400/day。福利&#xff1a;每天50租房补贴&#xff0c;20的餐补。晚上8点之后回去有额外的25元晚餐餐补&#xff0c;10点之后回去可以免费用滴滴。 组内的大模型工作大概分两个方向&#xff1a; 1.3B、3B等小…

基于opencv的单目相机标定

openCv版本&#xff1a;4.4.0 从源码处拷贝标定代码出来使用&#xff0c;需要拷贝samples/cpp/tutorial_code/calib3d/camera_calibration 需要的文件如下&#xff1a; -rw-rw-r-- 1 rog rog 28490 Jul 18 2020 camera_calibration.cpp -rw-rw-r-- 1 rog rog 3152 Jul 18 …

判断前端入参是否空否则提示前端写法

vue2中 前端先声明一个变量&#xff0c;用于alert判断 在templeat中定义一个提示语句 然后在点击事件时判断一下是否展示

【Linux】NFS网络文件系统搭建

一、服务端配置 #软件包安装 [roothadoop01 ~]# yum install rpcbind nfs-utils.x86_64 -y [roothadoop01 ~]# mkdir /share#配置文件修改 #格式为 共享资源路径 [主机地址] [选项] # [roothadoop01 ~]# vi /etc/exports /share 192.168.10.0/24(rw,sync,no_root_squash) #…

python数据可视化:集中趋势统计堆叠柱状图barplot()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 python数据可视化&#xff1a; 集中趋势统计 堆叠柱状图 barplot() [太阳]选择题 请问关于以下代码表述错误的选项是&#xff1f; import seaborn as sns import matplotlib.pyplot as plt im…

cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library

pip install cx_Oracleimport cx_Oracle 再导入该模块进行数据库连接的时候报错 这个错误表明您的Python环境是64位的&#xff0c;但是您尝试使用的Oracle客户端库&#xff08;oci.dll&#xff09;是32位的 根据官方给出的文档进行查看 cx_Oracle 8 Installation — cx_Ora…

Rancher 应用商店离线环境使用

前言 Rancher (v2.5 ) 应用商店可以方便的安装 Helm3 构建的应用&#xff0c;并且支持私有 helm 应用仓库&#xff0c;方便了内网离线环境下的使用。本文以内网离线环境为前提、以 MySQL 5.7.43 版本为应用举例&#xff0c;从零开始手把手教你如何制作并应用。 1、环境准备 1.…

Leetcode—1017. 负二进制转换【中等】(string列表初始化、反向迭代器)

2024每日刷题&#xff08;120&#xff09; Leetcode—1017. 负二进制转换 实现代码 class Solution { public:string baseNeg2(int n) {string ans;while(n ! 0) {ans to_string(n & 1);n -(n >> 1);}return ans.empty() ? "0": string{ans.rbegin(),…

Axure RP 9中文激活版:专业原型设计工具mac/win

Axure RP 9是一款由美国Axure Software Solution公司开发的专业原型设计工具。它凭借强大的交互功能和丰富的设计素材&#xff0c;为产品经理、UI设计师、交互设计师等用户提供了高效、便捷的原型设计体验。 Axure RP 9支持快速创建线框图、流程图、原型和规格说明文档&#xf…

03-JAVA设计模式-模板方法模式

模板方法模式 什么是模板方法 模板方法模式&#xff08;Template Method Pattern&#xff09;在Java中是一种行为型设计模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某…

AI文章写作网站

最强AI文章写作网站——心语流光&#xff08; Super Ai Writer &#xff09; 特点 多轮问答写作&#xff0c;自动携带历史记录进行问答可以自定义携带历史记录的轮数&#xff0c;为0则携带全部历史记录&#xff0c;有效避免token浪费&#xff08;类似coze平台&#xff09;AI生…

线上社交app的搭建,圈子社交系统,小程序+app+H5三端,源码交付,支持二开!

在科技飞速发展的大背景下&#xff0c;年轻人社交不再局限于面对面&#xff0c;线上社交app已深入各大年轻人的手机中。相比于传统交友方式&#xff0c;线上社交app为用户提供了更加新奇的交友体验。同时&#xff0c;它还可以吸引更多的朋友&#xff0c;提高用户的整体交友体验…

54.基于SpringBoot + Vue实现的前后端分离-外卖点餐系统(项目 + 论文PPT)

项目介绍 本站是一个B/S模式系统&#xff0c;采用SpringBoot Vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SpringBoot Vue技术的外卖点餐系统设计与实现管理工作系统…

一文带你了解MySQL的约束

文章目录 ☃️概述☃️分类☃️常用约束☃️外键约束❄️❄️外键删除/更新行为 欢迎来到 请回答1024 的博客 &#x1f34e;&#x1f34e;&#x1f34e;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平…