当前位置: 首页 > news >正文

【18】C实战篇——C语言 文件读写【fputc、fgetc、fputs、fgets】

文章目录

  • 3 文件的顺序读写
    • 3.1 逐字符读写
      • 3.1.1 逐字符写 fputc
      • 3.1.2 逐字符读 fgetc
    • 3.2 文本行的读写
      • 3.2.1 文本行的写 fputs
      • 3.2.2 文本行的写 fgets

3 文件的顺序读写

在这里插入图片描述

说到流,这里我们进行简单科普:

读写文件时我们需要:

  • 打开文件
  • 读写文件
  • 关闭文件

例如:我们在使用scanf,和printf时,并没有什么打开键盘,打开屏幕等一系列操作,默认就直接进行操作。

这是因为C程序只要运行起来,就默认打开三个流:

标准输入流  stdin
标准输出流  stdout
标准错误流  stderr

所以在使用scanf,printf时就可以默认使用。 它们的类型都是FILE*类型。

什么是流?

流是指数据在计算机中的传输方式,它是数据的有序序列,可以是字节、字符、图像、音频或视频等形式输入流用于从外部读取数据到计算机内存中,而输出流则用于将计算机内存中的数据写入到外部设备或文件中。流的操作可以是顺序的,也可以是随机的。

我们继续回到文件读写函数。

fgetc是字符输入函数,一次读入一个字符到程序当中,
fputc是字符输出函数,一次输出一个字符,它们都是适用于所有流的,可以是从键盘输入,也可以是从文件里读取输入。
至于输出,可以输出到屏幕上,也可以输出到文件里。

3.1 逐字符读写

3.1.1 逐字符写 fputc

我们可以来尝试一下写文件:
写26个字母写到这个data.txt文件中。

#include<stdio.h>int main()
{FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}int i = 0;for (i = 0; i < 26; i++){fputc('a' + i, pf);}fclose(pf);pf = NULL;return 0;
}

我们运行一下程序,在当前程序路径下找到data.txt文件。打开来看,它确实会按照顺序写入26个字母。
在这里插入图片描述

如果我们想要输出到屏幕上,就只需把fputc('a' + i, pf);里的pf换成stdout就行了

	//输出(写)到 文本//fputc('a' + i, pf);//输出(写)到 屏幕	fputc('a' + i, stdout);

在这里插入图片描述

3.1.2 逐字符读 fgetc

接下来我们尝试一下读文件:

我们将刚刚写入的文件数据保存,然后对文件进行读取数据:

#include<stdio.h>int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}int ch;for (int i = 0; i < 26; i++) {//从文本 读取ch = fgetc(pf);//从键盘 读取//ch = fgetc(stdin);printf("%c", ch);}fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
这里fgetc的返回值是int类型,如果遇到文件末尾或者读取失败会返回EOF。

此外fgetc函数还可以从键盘上读取,只需将fgetc(pf)改成fgetc(stdin);

3.2 文本行的读写

fgets和fputs

3.2.1 文本行的写 fputs

或许大家会想一次读写一个字符太麻烦了。接下来就是文本行的读写。

int main()
{FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}fputs("abcdef", pf);fclose(pf);pf = NULL;return 0;
}

这次我们重新读入,一次读入abcdef这6个字符。因为是同对一个文件进行操作,所有原先写入的数据会被覆盖。

我们再次打开data.txt ,可以观察到,文件中只有新写入abcdef。

在这里插入图片描述

3.2.2 文本行的写 fgets

fgets的参数依次是,读取后存放的位置,读取的字符个数(n-1)个,读取数据的位置。

我们可以先在读数据的文件中输入长度超过20的字符进行验证。

下面时26个字符,n=20;

在这里插入图片描述

int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}char ch[20] = { 0 };fgets(ch, 20, pf);//读num-1个printf("%s\n", ch);fclose(pf);pf = NULL;return 0;
}

可以看到 读取了 19个字符 ,//读num-1个

在这里插入图片描述

http://www.dtcms.com/a/315916.html

相关文章:

  • FPGA学习笔记——简易的DDS信号发生器
  • 力扣106:从中序与后序遍历序列构造二叉树
  • Android 之 Kotlin 和 MVVM 架构的 Android 登录示例
  • 宝塔(免费版9.2.0)的docker拉取仓库失败的加速方法
  • 数据挖掘,到底是在挖掘什么?
  • 27-数据仓库与Apache Hive-2
  • 26-数据仓库与Apache Hive
  • LTR-308ALS-01 LiteOn光宝高精度光耦隔离器 5000Vrms持续隔离电压
  • Python-初学openCV——图像预处理(七)——亮度变换、形态学变换
  • 基于Flask的微博话题多标签情感分析系统设计
  • 李宏毅深度学习教程 第12-13章 对抗攻击 + 迁移学习transfer learning
  • NLP——BERT模型全面解析:从基础架构到优化演进
  • Idea无法识别Maven项目处理
  • 机器翻译的局限性:歧义、文化差异、专业术语翻译难题
  • Python-深度学习--1交叉熵损失函数
  • aab文件直接安装到手机
  • 西门子PLC基础指令4:置位指令 S、复位指令 R
  • 超越注意力机制
  • 【基础】第二篇 Java 类的定义、构造器、成员变量与方法详解
  • hyper-v实战系列:显卡虚拟化(GPU分区)--windows篇详解
  • SpringCloud学习-------Eureka详解
  • FPGA设计思想与验证方法学系列学习笔记003
  • 基于Django的计算机资源爬虫及可视化系统的设计与实现
  • 【motion】HumanML3D 的安装2:psbody-mesh安装成功
  • Django中的转发与重定向详解
  • 利用m0改造循迹模块处理笔记00
  • Windows 安装 RabbitMQ 消息队列超详细步骤(附加详细操作截屏)
  • kettle插件-kettle http post plus插件,轻松解决https post接口无法调用文件流下载问题
  • python的高校考研交流系统
  • FastAPI快速入门P2:与SpringBoot比较