【C语言--------文件操作】

一.文件的概念

为什么使用文件?

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

什么是文件?

磁盘(硬盘)上的文件就是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件

和数据文件(从文件功能的角度来分类的)。


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

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

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

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

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

      一个数据在文件中的存储:字符型数据在内存中都是以ASCII形式存储的,数值类型既可以字符类型数据的存储方式,也可以采用二进制的存储方式。

三.文件的打开和关闭

         在学习文件的打开和关闭之前,我们得先了解流和标准流。

       

          程序中数据需要输出到各种外部设备,也需要从各种外部设备输入数据,不同的外部设备的输入和输出的操作不相同,为了方便对于各种设备的操作,我们就抽象出了流这个概念。我们可以将流想象成流淌着的字符的河。


        标准流:在C语言程序启动的时候,默认打开了三个流。

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

stdout-标准输出流,在大多数据环境下,输出至显示器界面,printf函数就是将信息输出到标准输出流当中。

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

以上这三个流的类型都是FILE*,通常称为文件指针(文件类型指针)。

C语言中就是通过FILE*的文件指针来维护流的各种操作的。通过文件指针就可以间接找到与他相关联的文件。

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

//打开文件
FILE* fopen(contst char* filename, const char* mode);
//关闭文件
FILE* fclose(const char* filename);

mode表示文件的打开模式,"r"(只读),"w"(只写),"a"(追加),"rb"(只读),"wb"(只写)等。

同时也要注意如果指定文件不存在的可能出错。

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

四.文件的顺序读写

fgetc——字符输入函数。(适用于所有输入流)

fputc——字符输出函数。(适用于所有输出流)

fgets——文本输入函数。(适用于所有输入流)

fputs——文本输出函数。(适用于所有输出流)

fscanf——格式化输入函数。(适用于所有输入流)

fprintf——格式化输出函数。(适用于所有输入流)

fread——二进制输入。(文件输入流)

fwrite——二进制输出。(文件输出流)

上面所说的适用于所有输入流指的是一般适用于标准输入流和其他输入流(如文件输入流);所有的输出流指的是一般适用于标准输出流和其他输出流(如文件输出流)。

五.文件的随机读写

1.fseek

根据文件指针的位置和偏移量来定位文件指针(文件内容的光标)。

int fseek(FILE* stream, long int offset, int origin);

例子:

#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;
}

2. ftell

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

long int ftell(FILE* stream);

例子:

#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);size = ftell(pfile);fclose(pfile);printf("size of myfile.txt:%ld bytes.\n",size);}return 0;
}

 rewind

让指针的位置回到文件的起始位置。

void rewind(FILE*stream)

例子:

#include <stdio.h>
int main()
{int n;FILE* pfile;char buffer[27];pfile = fopen("myfile.text", "w+");for (n = 'A'; n <= 'Z'; n++)fputc(n, pfile);rewind(pfile);fread(buffer, 1, 26, pfile);fclose(pfile);buffer[26] = '\0';printf(buffer);return 0;
}

六.文件读取结束

feof的作用

当文件读取结束的时候,判断读取结束的原因是否为:遇到文件末尾结束。

PS:不能用feof的返回值来判断文件是否结束。

1.文本文件是否读取结束

判断返回值是否为 EOF (fgetc)或者NULL(fgets)

例如:

fgetc 判断是否为EOF

fgets 判断是否为NULL.

eg:

#include <stdio.h>
#include <stdlib.h>
int main()
{int c;FILE* fp = fopen("test.txt", "r");if (!fp){perror("file opening failed");return EXIT_FAILURE;}//fgetc当读取失败的时候或者遇到文件结束的时候,都会返回EOFwhile ((c = fgetc(fp) != EOF))  //标准C   I/O读取循环{putchar(c);}//判断是什么原因结束的if (ferror(fp))puts("I/O error when reading");else if (feof(fp))puts("End of file reached successfully");fclose(fp);return 0;
}

2.二进制文件的读取结束判断

判断返回值是否小于实际要读取的个数。

例如:

fread判断返回值是否小于实际要读取的个数。

eg:

#include <stdio.h>
enum
{SIZE = 5
};
int main(void)
{double a[SIZE] = { 1.,2.,3.,4.,5. };FILE* fp = fopen("test.bin", "wb");//必须用二进制fwrite(a, sizeof(*a), SIZE, fp);fclose(fp);double b[SIZE];fp = fopen("test.bin", "rb");size_t ret_code = fread(b, sizeof(*b), SIZE, fp);//读double 的数组if (ret_code){puts("Array read successfully ,contents:");for (int i = 0; i < SIZE; i++)printf("%f ", b[i]);putchar('\n');}else{if (feof(fp))printf("error reading test .bin:unexpecxted end of file \n");else if (ferror(fp))perror("errror reading test.bin");}fclose(fp);
}

七.文件缓冲区

ANSIC标准采用 “缓冲文件系统” 处理数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。

从   内存   向    磁盘  输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。

如果从   磁盘   向   计算机     读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。

缓冲区的大小根据C编译系统决定的。

C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。

如有错误还望指出!

优质内容不断更新!! 

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

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

相关文章

Ubuntu 18.0.4 安装 libc6 2.28 及公钥验证相关

今天打算在 window 11 上安装一个 OWT-Server 环境。照着网上的 OWT-Server 5.0编译与运行指南 通过 docker pull registry.cn-hangzhou.aliyuncs.com/wisefeng/owt-server:v5.0 安装了已打包好的 docker 文件&#xff08;即已执行了 ./scripts/pack.js -t all步骤&#xff09;…

ORACLE 性能优化 高水位调节

当我需要去做优化时,有一个固定的优化思路:SQL优化->索引优化->分区优化->优化器hints优化 SQL 语句优化 1. 选用适合的 ORACLE 优化器 ORACLE 的优化器共有 3 种 : a. RULE ( 基于规则 ) b. COST ( 基于成本 ) c. CHOOSE ( 选 择性) 设置缺省的优化器, 可以通…

C语言贪吃蛇项目

今天给大家带来一款简单的贪吃蛇游戏&#xff0c;一起随我来看看吧 游戏效果&#xff1a; 实现基本的功能&#xff1a; • 贪吃蛇地图绘制 • 蛇吃⻝物的功能&#xff1a;&#xff08;上、下、左、右⽅向键控制蛇的动作&#xff09; • 蛇撞墙死亡 • 蛇撞⾃⾝死亡 • 计算得分…

paddleocr C++生成dll

目录 编译完成后修改内容: 新建ppocr.h头文件 注释掉main.cpp内全部内容&#xff0c;将下面内容替换进去。ppocr.h需要再环境配置中包含进去头文件 然后更改配置信息&#xff0c;将exe换成dll 随后右击重新编译会在根目录生成dll,lib文件。 注意这些dll一个也不能少。生成…

第七篇:专家级指南:Python异常处理的艺术与策略

专家级指南&#xff1a;Python异常处理的艺术与策略 1 引言 在编程的世界中&#xff0c;异常处理是一门必修的艺术。它不仅涉及到程序的错误处理&#xff0c;更广泛地影响着软件的稳定性、健壮性和用户体验。本篇文章将深入探讨Python中的异常处理&#xff0c;展示如何通过精心…

深度学习之基于YOLOv5智慧交通拥挤预警检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着城市化进程的加速和人口规模的不断增长&#xff0c;交通拥挤问题日益严重。传统的交通拥挤预警方…

C++Day 7 作业

1、lambda #include <iostream>using namespace std;int main() {int a 100;int b 90;int temp;auto fun [&]()mutable->int {temp a;ab;btemp;};fun();cout<<a<<endl;return 0; } 2、vector #include <iostream> #include <vector>…

控制台主机不能运行,切换终端实现RPG运行

鄙人转载&#xff0c;主要是移植过程中使用小熊猫C2.25.1 过程中&#xff0c;字符集不同&#xff0c;导致某些空格 从bilibili专栏粘贴导致出现符号不匹配&#xff0c;但是编辑器不能替换 用原来的devc 5.11 发现问题&#xff0c;读出额外的英文&#xff1f; 使用文件替换&…

延时任务通知服务的设计及实现(二)-- redisson的延迟队列RDelayedQueue

一、接着上文 RDelayedQueue作为redisson封装的一个分布式延迟队列&#xff0c;直接拿来使用还是比较简单的。 本文主要包括以下几部分&#xff1a; 保存至延迟队列&#xff08;生产者&#xff09;读取延迟队列&#xff08;消费者&#xff09;从延迟队列移除任务 二、rediss…

数据库语法复习

总结&#xff1a; DDL&#xff08;数据定义语言&#xff09; CREATE DATABASE&#xff1a;创建一个新的数据库。DROP DATABASE&#xff1a;删除一个数据库。CREATE TABLE&#xff1a;创建一个新的表。DROP TABLE&#xff1a;删除一个表。ALTER TABLE&#xff1a;修改表的结构&a…

什么品牌的洗地机好用性价比高?高性价比洗地机品牌推荐!

随着科技的发展&#xff0c;智能家居产品逐渐走入我们的生活&#xff0c;洗地机作为其中的代表之一&#xff0c;备受消费者关注。然而&#xff0c;面对市场上众多品牌的扫地机器人&#xff0c;消费者往往难以抉择。那么&#xff0c;洗地机哪个牌子好&#xff1f;为了给大家一个…

使用 Microsoft Azure 架构完善的框架构建出色的解决方案

原文&#xff1a;Build great solutions with the Microsoft Azure Well-Architected Framework - Training | Microsoft Learn 了解如何使用 Microsoft Azure 架构完善框架的支柱在 Azure 中设计和构建安全、可扩展、高性能的解决方案。 介绍 想象一下&#xff0c;您正在云…

Unity 实现新手引导遮罩

Unity 复写OnPopulateMesh 实现新手引导遮罩、包含点击事件触发区域判断 https://download.csdn.net/download/shenliang34/89247117

2024五一数学建模竞赛A题思路讲解

五一数学建模思路 具体思路如下&#xff1a; 提高钢板下料切割过程中的工作效率&#xff0c;是模具加工企业降低成本和增加经济效益的重要途径&#xff0c;其中钢板切割的路径规划是钢板切割过程的一个关键环节。 钢板切割就是使用特殊的切割技术&#xff0c;基于给定的下料切…

MouseBoost PRO for Mac激活版:强大的 鼠标增强软件

在追求高效工作的今天&#xff0c;MouseBoost PRO for Mac成为了许多Mac用户的得力助手。这款功能强大的鼠标增强软件&#xff0c;以其独特的智能化功能和丰富的实用工具&#xff0c;让您的电脑操作更加便捷、高效。 MouseBoost PRO for Macv3.4.0中文激活版下载 MouseBoost PR…

PotatoPie 4.0 实验教程(33) —— FPGA实现摄像头视频图像叠加

链接直达 https://item.taobao.com/item.htm?ftt&id776516984361 什么是视频水印&#xff1f; 视频水印就是图像叠加&#xff0c;跟画中画&#xff0c;或者是OSD是一样的原理&#xff0c;都是在视频的行场数据流上进行替换操作&#xff0c;比如叠加可以直接用水印图的数…

arthas无法捕获到try catch了的异常怎么办呢?

本案例使用的arthas是最新版本3.7.2 要跟踪的代码: 1、arthas watch试下能不能捕获到 页面上请求 http://localhost:8080/exception发现捕获不了。 2、可以使用btrace捕获,能够捕获到 我本案例使用Eclipse编写btrace脚本 ,首先引入btrace的jar包 <dependency> <g…

Java、Go 和 Rust 的比较

当涉及到Java、Go和Rust的比较时&#xff0c;主要考虑的是它们在性能、安全性、开发效率等方面的差异。下面将为你提供一个简单的例子&#xff0c;比较它们在并发编程方面的不同。 Java Java是一种面向对象的编程语言&#xff0c;广泛用于企业级应用和大型系统开发。它具有强…

scala基础学习--变量,标识符,类型和类型转换

一、基本学习 1、输出语句和分号 1.换行输出 println&#xff08;打印数据&#xff09;2.不换行输出 print(打印数据)3.分号使用 在多个打印在一行中间的分号必须写&#xff0c;末尾可以不写 2、Scala中常量 常量是指&#xff1a;在程序发生变化过程中&#xff0c;不会发…

跨语言摘要CLS近期论文研究总结(一)

1. A Cross-Lingual Summarization method based on cross-lingual Fact-relationship Graph Generation 基于跨语言事实关系图生成的跨语言摘要方法学习 首先&#xff0c;从源语言文档和目标语言参考摘要中提取事实三重信息&#xff0c;并构建其事实关系图。 然后&#xff0c…