【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程序只要运行起来,就默认打开三个流:

cpp 复制代码
标准输入流  stdin
标准输出流  stdout
标准错误流  stderr

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

什么是流?

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

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

fgetc是字符输入函数,一次读入一个字符到程序当中,

fputc是字符输出函数,一次输出一个字符,它们都是适用于所有流的,可以是从键盘输入,也可以是从文件里读取输入。

至于输出,可以输出到屏幕上,也可以输出到文件里。

3.1 逐字符读写

3.1.1 逐字符写 fputc

我们可以来尝试一下写文件:

写26个字母写到这个data.txt文件中。

cpp 复制代码
#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就行了

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

3.1.2 逐字符读 fgetc

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

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

cpp 复制代码
#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

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

cpp 复制代码
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;

cpp 复制代码
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个

相关推荐
老花眼猫1 小时前
曼陀罗2-曼陀罗图案自由创制App
c语言·经验分享·青少年编程·课程设计
爱读书的小胖2 小时前
Codewars: A Brave New Wordle(C)解题分析
c语言·数据结构·算法
Escalating_xu2 小时前
【数据结构】顺序表的应用:动态通讯录项目与双指针经典算法
c语言·数据结构·算法
从小白到软工3 小时前
C语言(中)预告
c语言·数据结构·经验分享·ai编程
Logic1014 小时前
C语言/数据结构字符串题解:解压缩“字符+次数“格式——多位数字处理与字符串还原
c语言·数据结构·字符串·模拟·时间复杂度·空间复杂度·算法题
SuperByteMaster5 小时前
while(1){;} 加分号
c语言
Logic1015 小时前
C语言/数据结构位运算题解:异或XOR找出糖葫芦派对中的“独一无二山楂果数量“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
星恒随风5 小时前
Linux进程信号(一):从Ctrl+C到kill、raise、alarm,深入理解信号的概念与产生原理
linux·c语言·笔记·学习·状态模式
学逆向的6 小时前
C 浮点数e(科学计数法)
c语言·开发语言·网络安全
知识分享小能手6 小时前
C学习教程,从入门到精通,C语言数组 —— 知识点详解(8)
c语言·学习·算法