文件及文件操作

欢迎来到本期频道!

你是否好奇文件到底是什么?是否想知道文件能干什么?

为了持久化的保存数据,文件应运而生.

一:文件

1.什么是文件

磁盘上的数据集(平常说的文件)就是文件。

2.文件名

文件路径+文件主干+文件后缀

例如:“D:\WeCha__t\WeChat.exe”

文件名结构
+
+
文件主干 WeChat
文件路径 D:\WeCha__t\
文件后缀 .exe
文件名
D:\WeCha__t\WeChat.exe
文件名

3.(文件功能角度)文件分类:

文件
程序文件
数据文件
二进制文件
文本文件

数据文件

文件的内容不一定是程序,而是程序运行时读写的数据。比如程序运行时需从中读取数据或往其中输出数据的文件。可以输入数据或着读取数据的文件。

将内存中的数据不加转换地存储到文件中的文件二进制文件.(二进制编辑器打开)

将内存中的数据转换成ASCLL码的形式存储到文件中的文件文本文件.(文本编辑器打开)

举例说明:
在这里插入图片描述

程序文件

是计算机中用于存储和执行计算机程序的文件。

例如:.c文件 .obj文件 .exe文件等

二:流

我们的程序需要输出到外部设备,或者从外部设备读取数据,不同的外部设备输入输出操作不同,为了方便程序员对各种设备的操作,抽象出了流的概念,可以把流想象成流淌着字符的河。

在这里插入图片描述

那为什么我们使用scanf,printf时没有打开流呢?
是因为C程序启动时,默认打开了3个标准流

标准流含义
stdin标准输入流,大多数环境下,从键盘输入。
stdout标准输出流,大多数环境下,从屏幕输出。
stderr标准错误流,大多数环境下,从屏幕输出。

1.这里的stdin,stdout,stderr是FILE*型,是文件类型指针。

2.每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息。

3.这个文件信息区是由系统声明的结构体变量,类型取名为FILE。这里的文件指针(stdin…)就是来维护文件信息区的。

内存中创建结构体
指向
文件信息区
使用文件
文件指针

三:文件操作

一般的文件操作是打开文件,操作文件,关闭文件。

1.打开文件

FILE* fopen ( const char * filename, const char * mode );

文件使用方式含义如果指定文件不存在
“r” / “rb”为了输入数据,以只读方式打开指定 文本/二进制 文件出错
“r+” / “rb+”为了输入输出数据,打开指定 文本/ 二进制 文件出错
“w” / “wb”为了输出数据,打开指定 文本/二进制 文件建立新文件
“w+” / “wb+”为了输出输入数据,打开指定 文本/二进制 文件建立新文件
“a” / “ab”给 文本/二进制 文件末尾添加数据建立新文件
“a+” / “ab+”在 文本/二进制 文件末尾输入输出数据建立新文件

2.操作文件

功能函数名适用于
字符 输入函数fgetc所有输入流
字符 输出函数fputc所有输出流
文本行 输入函数fgets所有输入流
文本行 输出函数fputs所有输出流
格式化 输入函数fscanf所有输入流
格式化 输出函数fprintf所有输出流
二进制 输入fread文件
二进制 输出fwite文件

3.关闭文件

int fclose ( FILE * stream );

由于fgets,fputs比较特殊,
这里我们介绍一下fgets,fputs:

Ⅰ.fputs

这是test.txt文本.

在这里插入图片描述

#include<stdio.h>
int main()
{
	FILE* fp = fopen("test.txt", "r+");
	if (fp == NULL)
	{
		perror("fopen:");
		return 1;
	}
	char ch[] = "xxxx";
	fputs((const char*)ch, fp);
	fclose(fp);
	fp = NULL;
	return 0;
}
结果:

在这里插入图片描述

这说明fputs是不会把'\0'输出进去的。

Ⅱ fgets

这是poet.txt文本:

在这里插入图片描述

#include<stdio.h>
int main()
{
	FILE* fp = fopen("poet.txt", "r");
	if (fp == NULL)
	{
		perror("fopen:");
		return 1;
	}
	char ch[4][20] = { 0 };
	int i = 0;
	while (fgets(ch[i], 20, fp) != NULL)
	{
		printf("%s", ch[i]);
		i++;
	}
	fclose(fp);
	fp = NULL;
	return 0;
}

我们调试一下来观察:
在这里插入图片描述

文本中第20个字符是'g',这里表明没有读取'g',然后添加了'\0'.

在这里插入图片描述

这里表明空间足够的情况下,遇到'\n'会停止,然后加上'\0'.

在这里插入图片描述
与上述相同。
在这里插入图片描述
与上述相同。
在这里插入图片描述

四:文件相关函数

文件缓冲区

ANSIC标准采用“缓冲文件系统”处理数据文件。
缓存文件系统:系统自动地在内存中为每一个正在使用的文件开辟一块“文件缓冲区”。

在这里插入图片描述

当缓冲区填满,或者主动输入输出,数据才会进入数据区/硬盘。

1.fseek

int fseek ( FILE * stream, long int offset, int origin );

该函数是用来设置文件指针位置的。
第一个参数是要操作的流;
第二个参数是相对于参考位置的偏移量;
第三个参数是参考位置;

常量参考位置
SEEK_SET文件起始位置
SEEK_CUR文件当前位置
SEEK_END文件末尾

2.rewind

void rewind ( FILE * stream );

该函数是把文件指针移动到文件开头。

3.feof

int feof ( FILE * stream );

在读取结束的情况下,该函数可判断是否是遇到 文件末尾 而导致的读取结束。是,返回非0;否,返回0.

4.ferror

int ferror ( FILE * stream );

在输入/输出操作结束后,判断是否是遇到 错误 而导致的读取结束。
是:返回非0;否:返回0

5.ftell

long int ftell ( FILE * stream );

正常:该函数返回文件指针相对与起始位置的偏移量.
异常:返回-1.
  • 37
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值