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语言-丰富多彩的文件操作(2) -> 正文阅读

[C++知识库]C语言-丰富多彩的文件操作(2)


按照300字/min,本文阅读大约要17min 左右

所有读写字符的函数

为了保证你们能够和之前的文件操作连接起来,我们重新展示了一下所有的读写函数
可以不看,这个是复习用的

函数名返回值参数
fgetcint(读取失败是 EOF,成功返回读取的字符的asc码)(FILE* stream)
fputcint(写入失败是 EOF,成功返回读取的字符的asc码)( int character, FILE * stream )
fgetschar *(成功返回 字符串, 失败返回NULL)( char * str, int num, FILE * stream )
fputs成功返回非负数,失败返回 EOF)( const char * str, FILE * stream )
fscanf成功会返回应该读取的元素个数,失败会返回小于应该读取的元素的个数( FILE * stream, const char * format, … )
fprintf成功会返回应该写入的元素个数,失败会返回负数( FILE * stream, const char * format, … )
fread成功返回读取的元素个数,失败返回个数小于 count( void * ptr, size_t size, size_t count, FILE * stream );
fwrite成功返回读取的元素个数( const void * ptr, size_t size, size_t count, FILE * stream )

字符以外的读写

一行字符的读写

主要是这两个函数

函数功能
fgets一次读取一个字符串
fputs一次输入一个字符串
char * fgets ( char * str, int num, FILE * stream );
int fputs ( const char * str, FILE * stream );

fgets 会让第 num 个值设置为 \0,所以要读 num 个字符的字符串,实际显示只有 num - 1 个字符

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
	char str[10] = { 0 };
	FILE* pF = fopen("example.txt","r");
	if (pF == NULL)
	{
		perror("fopen");
		return;
	}

	fgets(str,4,pF);
	fclose(pF);
	pF = NULL;

	printf("%s\n", str);
	return 0;
}

在这里插入图片描述
在 This is 的文件中只能拿出 Thi

通过一定的想象能力,我们可以知道

//假如我要向文件中放着 i am boring 的字符数组 str
fputs(str,pF);
//就可以了

带格式的读写

但是,许多情况下,文件不是读写字符就可以完成全部的工作的,C语言有丰富的数据类型,比如 int ,double 等,他们有应该能够被我们放进文件中,为了完成这个任务,我们可以使用带格式的读写

我们可以使用这两个函数

函数功能
fscanf从文件中带格式读取
fprintf带格式地写入到文件中

他们两兄弟很像 printf 和 scanf 两兄弟
他们的使用也几乎是一样的

int a = 0;
FILE* pF = fopen("test.txt","r");
scanf("%d",&a);
fscanf(pF,"%d",&a);//可以先写 scanf 然后再 补上文件指针
printf("%d",a);
fprintf(pF,"%d",a);//可以先写 printf 然后再 补上文件指针

如果我们要向文件写一个数组 到 test.txt
然后再读取出来,应该如何做

通过循环一个个写入,然后一个个读取出来就可以了
代码如下

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main()
{
	int a[10] = {2,5,4,6,9,7,8,3,1};
	int i = 0;
	FILE* pF = fopen("test.txt","w");
	if (pF == NULL)
	{
		perror("fopen");
		return 1;
	}

	for (i = 0; i < 10; i++)
	{
		fprintf(pF,"%d ", a[i]);
	}
	fclose(pF);
	pF = NULL;
	return 0;
}

当我们运行完,文件里面就有我们的数组了
这是咋插入的?
然后读取出来
代码如下

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main()
{
	int a[10] = {0};
	int i = 0;
	FILE* pF = fopen("test.txt","r");
	if (pF == NULL)
	{
		perror("fopen");
		return 1;
	}

	for (i = 0; i < 10; i++)
	{
		fscanf(pF, "%d", a + i);
	}
	fclose(pF);
	pF = NULL;

	for (i= 0;i<10;i++)
	{
		printf("%d ",a[i]);
	}
	return 0;
}

运行打印得到
在这里插入图片描述
这两兄弟和 printf 和 scanf 很相似,我们合理猜测一下,我们能不能把我们键盘的输入直接通过 fscanf 和 fprintf 来进行输出呢?
结论是可以的

标准输入输出

对于程序来说,有三种标准流,
标准输出流叫做stdout,是我们的屏幕
标准输入叫做stdin,是我们的键盘
标准错误流叫做stdout,是我们的屏幕
这个时候,我们可以将标准流看成文件
直接通过 fscanf 和 fprintf 从键盘读取数据后写到我们的屏幕上
代码如下

int main()
{	
   int a = 0;
   fscanf(stdin,"%d",&a);
   fprintf(stdout,"%d",a);
   return 0;
}

在这里插入图片描述
右下角为输入输出

printf 和 scnaf 族

scanf/fscanf/sscanf

函数功能
scanf从标准输入(键盘)有格式地读取
fscnaf从任意输入(文件或键盘)有格式地读取
sscanf从字符串中有格式地读取

printf/fprintf/sprintf

函数功能
printf从标准输入(键盘)有格式地打印
fprintf从任意输入(文件或键盘)有格式地写入
sprintf从字符串中有格式地写入

二进制的读写

C语言 是允许我们自定义数据类型的,比如 struct,union 等等
这些长度可变的东西 , 单独的格式读取就满足不了我们了,C语言允许我们将内存一样对待文件,直接按照字节来直接把内容放到文件里面
但是前提是 我们是以二进制的方式来打开,关闭,读取和写入文件(打开方式是 wb 与 rb )

二进制文件和文本文件

二进制文件的相对概念就是文本文件
文本文件就是我们看到的文件内容,他是以字符的形式展示出来,我们能够认得的
比如上一个例子中的格式数组写入和读取,他的文件我们可以直接看得明白,内容是对应的 asc码放在文件中,这个就是文本文件
但是
有一种文件,程序不会将要写入或者读取的数据转换为 asc 码,而是直接按照机器的二进制写入和读取
这个时候那个文件就是二进制文件
区别就是 同一个内容的储存方式是二进制或者是 asc 码

如果之前的这个数组
这是咋插入的?
我们通过二进制的方式写到文件中,显示出来时什么样子呢、
在这里插入图片描述
得到一群乱码,但是计算机读的明白就可以了,这个无所谓
我们通过二进制读取,打印得到的结果是一样的
在这里插入图片描述

二进制读写函数

有两个函数用来帮助我们按照字节一般帮我们把内容从文件中拿出,或者放到文件里面

函数功能
fread按照二进制方式读取文件
fwrite按照二进制方式写入文件

如果我们要写入一个书架,这个书架中有 好多本书,每一本书有书名,书的价格等
那应该如何写入呢?
假设三本书分别叫
“peace and war”,“C++ prime”,dead"
代码如下


int main()
{	
	struct Book bookshe[3] = { {"peace and war",40},{"C++ prime",35},{"dead",25}};
	FILE* pF = fopen("my_book.txt","wb");//二进制打开
	if (pF == NULL)
	{
		perror("fopen");
		return 1;
	}
	fwrite(bookshe,sizeof(struct Book),3,pF);
	fclose(pF);
	pF = NULL;
	return 0;
}

里面文件是这样的

在这里插入图片描述

我们读取出来,然后分别打印

int main()
{	
	struct Book bookshe[3] = { 0};
	FILE* pF = fopen("my_book.txt","rb");//二进制打开
	if (pF == NULL)
	{
		perror("fopen");
		return 1;
	}
	fread(bookshe,sizeof(struct Book),3,pF);
	fclose(pF);
	pF = NULL;
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		printf("%s\n",bookshe[i].name);
	}
	return 0;
}

结果是这样的
在这里插入图片描述

文件和系统的关系

之前
我们读取文件时使用的是"文件缓冲系统",这个系统在对文件进行操作的时候会自动为正在使用的文件开辟一个文件缓冲区
在这里插入图片描述
这个缓冲能够提高文件操作的效率,当缓冲区满的时候,才进行下一步操作
举个例子,我要是有问题,一想到直接问老师,还是存一会再去问老师效率高呢?
第二种是不是老师也能做些别的事情?

比如把数据写到硬盘里头,把数据读取到内存数据区中
通过 fclose 和 fflash 能够对缓冲区强制刷新,缓冲区的内容直接强制下一步执行

在这里我们可以想到 getchar 这些从键盘读取的函数也有缓冲区的概念
限于篇幅就不讲了

总结

C语言提供了字符串读写,格式化读写和二进制读写,我们把重点放在了格式化读写和 scanf 和printf 族的比对上,同时也见识到了 二进制读写直接无视格式,按照长度直接读写的强大功能,最后我们也看到了为了快速性,缓存区的概念也运用到了文件当中

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-10-22 20:56:54  更:2022-10-22 20:58:45 
 
开发: 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 6:20:57-

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