IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言文件详解(二)文件的顺序读写 -> 正文阅读

[C++知识库]C语言文件详解(二)文件的顺序读写

一、文件顺序读写函数及其关系示意图

文件的顺序读写函数的函数功能和适用于如下图:

?内存与文件之间的函数操作以及数据的输入输出示意图如下图:

?

二、函数详细介绍与示范

1.fputc(字符输出函数)(写"w")

作用: 将字符character写入到文件指针stream所指的文件中去。

注意!!!返回的为int 型,返回的为字符的ASCII值

读取成功,返回字符的ASCII值,读取失败返回EOF。

示范代码:

#include<stdio.h>
int main()
{
	//相对路径
	//打开文件,新建test.txt文件(注意!!所创建的文件在当前工程test_10_13文件路径下)
	FILE*pf = fopen("test.txt","w");

	if (pf==NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	//fputc('a',pf);   将字符a写入到文件指针pf所指的文件里去。
	int i = 0;
	for (i = 0; i < 26;,i++)
	{
		fputc('a'+i,pf);
	}
			
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

?运行结果:


2.fgetc(字符输入函数)(读"r")

作用: 读取文件指针stream所指的文件中的字符。

注意!!!返回的为int 型,返回的为字符的ASCII值

读取成功,返回字符的ASCII值,读取失败返回EOF。

?示范代码:

#include<stdio.h>
int main()
{
	//相对路径
	//打开文件,新建test.txt文件(注意!!所创建的文件在当前工程test_10_13文件路径下)
	FILE*pf = fopen("test.txt","r");

	if (pf==NULL)
	{
		perror("fopen");
		return 1;
	}
	//读文件
	int ch = fgetc(pf);
	printf("%c\n",ch);

	ch = fgetc(pf);
	printf("%c\n", ch);

	ch = fgetc(pf);
	printf("%c\n", ch);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

文件内容:

?打印结果:

?注意!!!一个读字符后,文件中的指针自动会指向下一个字符。

优化代码:读取成功返回ASCII值,失败返回EOF。

	//读文件
	int ch = 0;
	while ((ch=fgetc(pf))!=EOF)
	{
		printf("%c\n",ch);
	}

3.fputs(文本行输出函数)(写"w")

作用:将字符串str写入文件中去,写入的字符串无换行(需换行可自行加\n)

示范代码;

	FILE*pf = fopen("test.txt","w");

	if (pf==NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件,一行一行的写
	fputs("hello",pf);
	fputs("word", pf);

	//关闭文件
	fclose(pf);
	pf = NULL;

运行结果:

?4.fgets(文本行输入函数)(读"r")

作用:最多读取文件中的num个字符到str中去。

其中,str为读取字符所存放的位置,num为最多读取的字符数。

注意!!!真实读取的字符为num-1个!!!

代码示范:

	FILE*pf = fopen("test.txt","w");

	if (pf==NULL)
	{
		perror("fopen");
		return 1;
	}
	//读文件,一行一行的读

	char arr[] = "##########";
	fgets(arr,5,pf);

	//关闭文件
	fclose(pf);
	pf = NULL;

文件内字符:

?

调试结果:

代码中num =5,最大读取5个字符,实际值读取了'h','e','l''l'四个字符,所以读取的最后一个字符为‘\n’

实际读取了num-1个字符即5-1=4个字符。

所以打印的时候无需加'\n'换行,因为所读取的最后一个字符即为'\n'!!!!!

	char arr[20] = "##########";
	fgets(arr,20,pf);
	printf("%s",arr);
	fgets(arr, 20, pf);
	printf("%s", arr);

	//关闭文件
	fclose(pf);
	pf = NULL;

?5.fprintf(格式化输出函数)(写"w")

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

?作用:将数据按照相应的格式写入输出到文件中去。

fprintf对比于printf,fprintf函数多了一个参数FILE * stream。

示范代码:

#include<stdio.h>
struct s
{
	char name[20];
	int age;
	float score;
};
int main()
{
	struct s stu = { "zhangsan", 20, 90.5f }; //初始化结构体
	FILE*pf = fopen("text.txt","w");  //新建文件
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	fprintf(pf,"%s %d %f",stu.name,stu.age,stu.score);

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

文件内容:

??5.fscanf(格式化输入函数)(读"r")

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

??作用:格式化读取文件中的数据。

fscanf对比于scanf,fscanf函数多了一个参数FILE * stream。

示范代码:

#include<stdio.h>
struct s
{
	char name[20];
	int age;
	float score;
};
int main()
{
	struct s stu = { 0 };
	FILE*pf = fopen("text.txt","r");
	if (pf==NULL)
	{
		perror("fopen");
		return 0;
	}
	//读文件
	fscanf(pf,"%s %d %f",stu.name,&(stu.age),&(stu.score));
	printf("%s %d %f", stu.name, stu.age, stu.score);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

运行结果:

??6.fwrite(二进制输入)(写"w")

???作用:从指针ptr开始所指向的数据里面,一次写上count个大小为size的数据到文件里面去。

示范代码:

#include<stdio.h>
struct s
{
	char name[20];
	int age;
	float score;
};
int main()
{
	struct s stu = {"zahngsan",20,90.5f}; //初始化结构体
	FILE*pf = fopen("text.txt","wb");  //新建文件,"wb"二进制写
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	fwrite(&stu,sizeof(stu),1,pf);//将结构体stu写入文件中。

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

文件内容:二进制xign

?7.fread(二进制输出)(读"r")

??作用:从文件读取count个大小为size的数据到ptr所指向的空间里去。

示范代码:

#include<stdio.h>
struct s
{
	char name[20];
	int age;
	float score;
};
int main()
{
	struct s stu = { 0 }; //初始化结构体
	FILE*pf = fopen("text.txt", "rb");  //新建文件,"rb"二进制读
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	fread(&stu, sizeof(stu), 1, pf);//将文件中的数据读入到stu里去。
	printf("%s %d %f",stu.name,stu.age,stu.score);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

运行结果:

?三、额外补充

fgetc,fputc,fgets,fputs,fscanf,fprintf适用于所有输出流/输入流,而printf,scanf只适用于标准输出流/标准输入流。

那么如何通过fgetc,fputc来实现标准标准输出流/标准输入流的输出,输入(从键盘上读,屏幕上写)呢?

?

对于任何一个C程序,只要运行起来,就默认打开3个流:

stdin --标准输入流--键盘

stdout--标准输出流--屏幕? ?

stderr--标准错误流--屏幕

注意!!!!stdin,stdout,stderr都是FILE*类型。

示范代码:

#include<stdio.h>
int main()
{
	int ch = fgetc(stdin);  //从标准输入流输入
	fputc(ch,stdout);  //从标准输出流输出。
	return 0;
}

运行结果:

?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 12:13:43  更:2022-10-17 12:17:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 2:27:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码