C语言:文件操作2(又一万字?)

news2024/11/25 11:04:25

关于文件操作这章内容,因为知道内容较多所以我分两篇发了,但是还是没料到第二篇还是这么多,达到了一万多字!!!作者本人真的将知识点进行了超级详解分析并且举了很多例子来帮助读者理解,本文章较长,请耐心阅读体会,如果读完对你有用的话,请给作者留下你的:

在这里插入图片描述


5.文件的顺序读写

顺序读写函数介绍

在这里插入图片描述

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

1.fputc函数

在这里插入图片描述
运行完之后中,打开data.txt文件,里面放的就是xyz。

在这里插入图片描述
我们也可以用循环来写文件。

在这里插入图片描述
在这里插入图片描述

这就是fputc函数,一次只能写入一个字符,但是我们可以调用它写入多个字符,在开始写文件时,有一个光标在起始位置,随着fputc一次一次的写入,光标会按照顺序往下走,这样的话你就是按照顺序写进去的。

如果该函数指定为标准输出流,就是回打印到屏幕上

在这里插入图片描述

在这里插入图片描述
所以fputc适用于所有输出流:如:文件,stdout。

2.fgetc函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

从上面打印结果可得它是顺序读的方式。

我们也可以写一个循环来读文件

在这里插入图片描述

它适用于所有输入流如:文件,stdin这是从键盘输入的,当我们按下crtrol z它会返回一个EOF循环停止。

在这里插入图片描述

上面是一个字符的读写,我们来看一行字符的读写。

写文件

3.fputs函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

想要换到两行上,可以加上\n。

在这里插入图片描述
在这里插入图片描述

读文件

4.fgets函数

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我们只读到前4个字符,所以当我们写n个字符的时候,只会读n-1的字符,最后一位留给\0。

在这里插入图片描述
在这里插入图片描述

打印的时候不用加换行符,因为写文件的时候字符串里面有\n,所以打印的时候会自动换行。

再次读文件得时候,读的是第二行的信息

在这里插入图片描述
同样也把末尾的\n也读走了,来看打印结果

在这里插入图片描述

我们同样也可以用循环来读文件,fgets函数若读取失败的话,会返回空指针,根据该特性,我们可以这样写代码

在这里插入图片描述

我们来直接多加几行。

在这里插入图片描述

在这里插入图片描述

我们再来看fscanf函数和fprintf函数。

5.fprintf函数

在这里插入图片描述
在这里插入图片描述

运行完之后,看是否这些带有格式的数据被放在文件中。

在这里插入图片描述

记住我们将带有格式的数据,以格式写入文件中。

6.fscanf函数

在这里插入图片描述
在这里插入图片描述

结果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

当我们这样写代码的时候一个可以代替printf函数,一个可以代替scanf函数。

我们再来看两个函数sprintf和sscanf。

7.sprintf函数

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

8.sscanf函数

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

我们来将上面内容稍微总结一下
在这里插入图片描述

fread和fwrite函数

9.fwrite函数

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

我们来运行一下,看看到底能不能写到文件中去。

在这里插入图片描述

我们打开data.txt文件,看不懂里面的内容因为它是二进制的。

在这里插入图片描述

我们可以这样操作:添加现有项,把data.txt文件添加进来,再以二进制形式打开它(在打开方式里面找),我们以二进制形式来看文件的内容。

在这里插入图片描述

fread是可以读取二进制的信息的。

10.fread函数

在这里插入图片描述

在这里插入图片描述

我们来运行看打印结果

在这里插入图片描述

我们同样也可以写个循环来读文件

在这里插入图片描述

在这里插入图片描述
但是当我们不知道文件中有几个元素该怎么读呢?我们来看fread函数的返回值

在这里插入图片描述

fread函数它的返回值是成功读取的个数,若没有成功读取就返回0,所以我们可以这样写代码

在这里插入图片描述
在这里插入图片描述

fread函数的返回值如果小于要求读取的个数,就意味着这是最后一次读取了。


6.文件的随机读写

1.fseek

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

1   int fseek ( FILE* stream, long int offset, int orgin );

在这里插入图片描述
在这里插入图片描述

假设我们有一个文件data.txt里面是abcdef,我们用fread函数,写第二个参数时,要根据第三个参数来写,先确定光标位置,再给出偏移量。

在这里插入图片描述

在这里插入图片描述

这个时候我们就跳过了b和c字符,读取到了d。

另外两个写法,就是看你的起始地址从哪里开始记,改变偏移量实现读取。

在这里插入图片描述
在这里插入图片描述

最后一个方法因为光标是从后往前偏移,所以偏移量为-3。

2.ftell

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

1   long int ftell ( FILE * stream );

根据我上面所举的例子,当我们上面读完d之后,光标指向了e,我们可以用ftell函数来计算当前光标相对起始地址的偏移量。

在这里插入图片描述
在这里插入图片描述

3.rewind

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

1   void rewind ( FILE * stream );

在这里插入图片描述
在这里插入图片描述


7.文件读取结束的判定

1.被错误使用的 feof

牢记:在文件读取过程中,不能用feof函数的返回值直接来判断文件的是否结束。feof 的作用是:当文件读取结束的时候,判断读取结束的原因是否是:遇到文件尾结束。
1.文本文件读取是否结束,判断返回值是否为EOF (fgetc),或者NULL (fgets)例如:
fgetc 判断是否为EOF.
fgets 判断返回值是否为NULL
2.二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:
fread判断返回值是否小于实际要读的个数。

在这里插入图片描述

2.文本文件的例子

#include <stdio.h>
#include <stdlib.h>

int main (void)
{
     int c; //注意:int,非char,要求处理EOF
     FILE* fp = fopen("data.txt","r");
     if(!fp)
     {
           perror("File opening failed");
           return EXIT_FAILIRE;
      };
      //fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF
      while((c = fgetc(fp) != EOF )// 标准C I/O读取文件循环
      {  
          putchar(c);
      }
      //判断是什么原因结束的
      if(ferror(fp))
           puts("I/O error when reading");
      else if (feof(fp))
           puts("EOF of file reached successfully");
      fclose(fp);
}
     

ferror(fp)如果返回是非零值,说明在读取过程中发生错误,并没有读到文件末尾。

feof(fp)返回值为非零值,说明读到文件末尾停止了。

在这里插入图片描述

3.二进制文件的例子

#include <stdio.h>

enum { SIZE = 5 };

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

8.文件缓冲区

ANSIC标准采用"缓冲文件系统"处理数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正
在使用的文件开辟一块"文件缓冲区"。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到
磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓
冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

在这里插入图片描述
完结!!!

在这里插入图片描述

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

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

相关文章

RabbitMQ队列详细属性(重要)

RabbitMQ队列详细属性 1、队列的属性介绍1.1、Type&#xff1a;队列类型1.2、Name&#xff1a;队列名称1.3、Durability&#xff1a;声明队列是否持久化1.4、Auto delete&#xff1a; 是否自动删除1.5、Exclusive&#xff1a;1.6、Arguments&#xff1a;队列的其他属性&#xf…

【大模型】相比现有智能体(Agent)系统,微软新推出的 Magnetic-One 值得一看吗?

微软最近发布的Magnetic-One智能体系统在开源社区引发了广泛关注&#xff0c;因其在性能、灵活性和扩展性方面表现出色&#xff0c;被誉为目前开源社区最强的智能体解决方案。本文将从评测结果、工作原理、与现有智能体系统的比较三个方面&#xff0c;全面解析Magnetic-One的独…

C++——左值和右值的本质区别

左值和右值好干嘛&#xff1f; 深入理解左值和右值可以帮助我们对代码进行优化 一、什么是左值和右值 左值&#xff1a;有某种存储支持的变量 右值&#xff1a;临时值&#xff08;字面量、函数的结果&#xff09; Ⅰ右值是字面量 int yy 22;22本身就是一个临时的&#xf…

Rust-AOP编程实战

文章本天成,妙手偶得之。粹然无疵瑕,岂复须人为?君看古彝器,巧拙两无施。汉最近先秦,固已殊淳漓。胡部何为者,豪竹杂哀丝。后夔不复作,千载谁与期? ——《文章》宋陆游 【哲理】文章本是不加人工,天然而成的,是技艺高超的人在偶然间所得到的。其实作者所说的“天成”…

深入了解支持向量机:机器学习中的经典算法

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

第01章 Linux概述及系统环境搭建

目标: ◆ 知道 Linux 是什么&#xff1f;有什么特点&#xff1f; ◆ 知道 Linux 内核及发行版的区别 ◆ 知道 Linux 的应用领域 ◆ 能够在虚拟机软件上新建虚拟机 ◆ 能够在虚拟机中挂载CentOS6.7光盘镜像 ◆ 能够根据需求安装CentOS6.7的操作系统 ◆ 能够对系统进行登录和关闭…

【题解】—— LeetCode一周小结45

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结44 4.平方数之和 题目链接&#xff1a;633. 平方数之和 给定一…

Python爬虫基础-正则表达式!

前言 正则表达式是对字符串的一种逻辑公式&#xff0c;用事先定义好的一些特定字符、及这些特定字符的组合&#xff0c;组成一个“规则的字符串”&#xff0c;此字符串用来表示对字符串的一种“过滤”逻辑。正在在很多开发语言中都存在&#xff0c;而非python独有。对其知识点…

kdump 应该怎么安装 linux-crashdump kdump-tools

sudo apt install linux-crashdump sudo apt install crash sudo apt install kdump-tools 1. 两个工具的关系 linux-crashdump kdump-tools 在 Ubuntu 上安装 kdump 功能&#xff0c;这两个包都是相关的&#xff0c;但有不同的作用. linux-crashdump 是一个元包&#xff08;…

STM32F405RGT6单片机原理图、PCB免费分享

大学时机创比赛时画的板子&#xff0c;比到一半因为疫情回家&#xff0c;无后续&#xff0c;&#xff0c;&#xff0c;已打板验证过&#xff0c;使用stm32f405rgt6做主控 下载文件资源如下 原理图文件 pcb文件 外壳模型文件 stm32f405例程 功能 以下功能全部验证通过 4路…

2024-11-01 - 统一身份认证 - OpenLdap - 中间件 - 流雨声

摘要 2024-11-01 周五 杭州 暴雨 调查问卷: https://www.wjx.cn/vm/exIBFDM.aspx# 2024年转瞬即逝&#xff0c;可是生活还在继续&#xff0c;这里有一项关于人工智能和项目管理对于效能关系的调研问卷&#xff0c;AI 对工作的作用和影响。问卷不采集个人信息&#xff0c;在此…

基于微信小程序的电商平台+LW示例参考

1.项目介绍 系统角色&#xff1a;管理员、普通用户功能模块&#xff1a;管理员&#xff08;用户管理、商品分类、商品管理、订单管理、系统管理等&#xff09;&#xff0c;普通用户&#xff08;个人中心、收藏、我的订单、查看商品等&#xff09;技术选型&#xff1a;SpringBo…

python读取word的自动编号以及添加自动编号

目录 1、读取编号 读取示例 如何判断段落是否有自动编号呢&#xff1f; 如何区分不同的类型编号呢&#xff1f; 2、添加自动编号 有的时候需要提取word中带自动编号的信息。对于word中的文字很多第三方的库都可以搞定&#xff0c;但是&#xff0c;提取格式&#xff0c;可能…

ImportError: cannot import name ‘packaging‘ from ‘pkg_resources‘ 的参考解决方法

文章目录 写在前面一、问题描述二、解决方法参考链接 写在前面 自己的测试环境&#xff1a; Ubuntu20.04 ROS-Noetic 一、问题描述 自己在通过 pip install 安装module时 &#xff08;使用的是 pip install mmcv&#xff09;遇到如下问题&#xff1a; ImportError: cannot …

【论文笔记】Wings: Learning Multimodal LLMs without Text-only Forgetting

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Wings: Learning Multimod…

Tomasulo算法介绍

Tomasulo算法详细解释 #mermaid-svg-x5G4yi740f0ju3OB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-x5G4yi740f0ju3OB .error-icon{fill:#552222;}#mermaid-svg-x5G4yi740f0ju3OB .error-text{fill:#552222;strok…

【C++练习】二进制到十进制的转换器

题目&#xff1a;二进制到十进制的转换器 描述 编写一个程序&#xff0c;将用户输入的8位二进制数转换成对应的十进制数并输出。如果用户输入的二进制数不是8位&#xff0c;则程序应提示用户输入无效&#xff0c;并终止运行。 要求 程序应首先提示用户输入一个8位二进制数。…

量子计算包kaiwu安装过程踩过的坑

目录 1 安装过程 2 官方代码测试 3 踩坑说明 首先&#xff0c;目前的kaiwu版本仅支持python3.8&#xff0c;所以必须要下载python3.8才能运行kaiwu 1 安装过程 step1: 在页面的SDK标签下&#xff0c;找到对应操作系统的kaiwu包。 step2: 下载python3.8到本地&#xff0c;可…

全文检索ElasticSearch到底是什么?

学习ElasticSearch之前&#xff0c;我们先来了解一下搜索 1 搜索是什么 ① 概念&#xff1a;用户输入想要的关键词&#xff0c;返回含有该关键词的所有信息。 ② 场景&#xff1a; ​ 1互联网搜索&#xff1a;谷歌、百度、各种新闻首页&#xff1b; ​ 2 站内搜索&#xff…