文件(完整)

目录

一、文件的打开与关闭

(一)文件指针

(二) 文件的打开和关闭

二、文件的顺序读写

 (一)fputc

1. 介绍

2. 举例

(二)fgetc

1. 介绍

2. 举例1

3. 举例2

(三) fputs

1. 介绍

2. 举例

(四)fgets

1. 介绍

2. 举例

(五)fprintf

1. 介绍

2. 举例

(六)fscanf

1. 介绍 

​编辑

2. 举例

(七)区分scanf,printf;fscanf,fprintf;sscanf,sprintf

(八)fwrite

1. fwrite函数介绍

2. 举例

(九)fread

1. fread函数介绍

2. 举例

三、文件的随机读写

(一)fseek

1. fseek函数介绍

2. 举例

 (二)ftell

1. ftell函数介绍

2. 举例

(三)rewind

1. rewind函数介绍

2. 举例

四、文本文件和二进制文件

(一)基本概念

(二)一个数据在内存中是怎么存储的

(三)举例(数值型数据)

(四)举例(字符型数据)

五、文件读取结束的判定(feof)

1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc )或者 NULL ( fgets )

2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数

3. 举例


一、文件的打开与关闭

(一)文件指针

  • 缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”
  • 每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名FILE
  • 每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。
  • 一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。
  • 下面我们可以创建一个FILE*的指针变量 
FILE* pf;//文件指针变量
  • 定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件

(二) 文件的打开和关闭

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("C:\\Users\\86173\\Desktop\\data.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
		

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

二、文件的顺序读写

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

 (一)fputc

1. 介绍

int fputc( int c, FILE *stream );

2. 举例

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("C:\\Users\\86173\\Desktop\\data.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	
	//写文件---输出操作
	fputc('g', pf);
	fputc('h', pf);

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

(二)fgetc

1. 介绍

int fgetc( FILE *stream );//读取错误或者读到文件末尾返回EOF
                          //读取正确返回字符的assic码值

2. 举例1

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("C:\\Users\\86173\\Desktop\\data.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	
	//读文件---输入操作
	int ch = 0;
	while ((ch=fgetc(pf))!=EOF)
	{
		printf("%c ", ch);
	}

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

3. 举例2

(三) fputs

1. 介绍

int fputs( const char *string, FILE *stream );

2. 举例

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("C:\\Users\\86173\\Desktop\\data.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	
	//写文件---写一行
	fputs("qaz",pf);
	fputs("wsx", pf);

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

(四)fgets

1. 介绍

2. 举例

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	char arr[200] = "xxxx";
	//打开文件
	FILE* pf = fopen("C:\\Users\\86173\\Desktop\\data.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	

	//读文件---读一行
	fgets(arr, 3, pf);
	printf("%s", arr);
	/*while (fgets(arr, 199, pf) != NULL)
	{
		printf("%s", arr);
	}*/
	

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

(五)fprintf

1. 介绍

2. 举例

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
struct Stu
{
	char name[20];//姓名
	int age;//年龄
	double d;//分数
};
int main()
{
	struct Stu s = { "张三",19,78.6 };

	//打开文件
	FILE* pf = fopen("C:\\Users\\86173\\Desktop\\data.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//写文件
	fprintf(pf, "%s %d %lf", s.name, s.age, s.d);


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

(六)fscanf

1. 介绍 

2. 举例

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
struct Stu
{
	char name[20];//姓名
	int age;//年龄
	double d;//分数
};
int main()
{
	struct Stu s = { "张三",19,78.6 };

	//打开文件
	FILE* pf = fopen("C:\\Users\\86173\\Desktop\\data.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//读文件
	//类比scanf("%s %d %lf", s.name, &(s.age), &(s.d));
	fscanf(pf,"%s %d %lf", s.name, &(s.age), &(s.d));
	printf("%s %d %lf", s.name, s.age, s.d);

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

 

(七)区分scanf,printf;fscanf,fprintf;sscanf,sprintf

 

  • scanf:格式化的输入函数
  • printf:格式化的输出函数
  • fscanf:针对所有输入流的格式化的输入函数
  • fprintf:针对所有输出流的输出函数
  • sscanf:把一个字符串转换成格式化的数据
  • sprintf:把一个格式化的数据转换成字符串
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
struct Stu
{
	char name[20];//姓名
	int age;//年龄
	double d;//分数
};
int main()
{
	struct Stu s = { "张三",21,47.7 };
	char buf[200] = { 0 };
	struct Stu tmp = { 0 };

	sprintf(buf, "%s %d %lf", s.name, s.age, s.d);
	printf("%s\n", buf);

	//从buf字符串中提取结构体数据
	sscanf(buf, "%s %d %lf", tmp.name, &(tmp.age), &(tmp.d));
	printf("%s %d %lf", tmp.name, tmp.age, tmp.d);
	return 0;
}

(八)fwrite

1. fwrite函数介绍

  • 以二进制方式写

2. 举例

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
struct Stu
{
	char name[20];
	int age;
	double d;
};
int main()
{
	struct Stu s = {"张三",23,67.4};
	//写文件---二进制方式写文件
	FILE* pf = fopen("C:\\Users\\86173\\Desktop\\data.txt", "wb");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//以二进制方式写文件
	fwrite(&s,sizeof(struct Stu),1,pf);

	fclose(pf);
	pf = NULL;
	return 0;
}

(九)fread

1. fread函数介绍

  •  以二进制方式读

2. 举例

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
struct Stu
{
	char name[20];
	int age;
	double d;
};
int main()
{
	struct Stu s = { 0 };
	//读文件---以二进制方式读文件
	FILE* pf = fopen("C:\\Users\\86173\\Desktop\\data.txt", "rb");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//以二进制方式读文件
	fread(&s, sizeof(struct Stu), 1,pf);

	printf("%s %d %lf\n", s.name, s.age, s.d);
	
	
	fclose(pf);
	pf = NULL;
	return 0;
}

 

三、文件的随机读写

(一)fseek

1. fseek函数介绍

2. 举例

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("C:\\Users\\86173\\Desktop\\data.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	写文件---输出操作
	//fputc('a', pf);
	//fputc('b', pf);
	//fputc('c', pf);
	//fputc('d', pf);
	//fputc('e', pf);
	//fputc('f', pf);
	//fputc('g', pf);

	//随机读
	int ch = fgetc(pf);
	printf("%c\n", ch);//a

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

	fseek(pf, 2, SEEK_CUR);
	ch = fgetc(pf);
	printf("%c\n", ch);//e


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

 (二)ftell

1. ftell函数介绍

2. 举例

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	FILE* pf =fopen("C:\\Users\\86173\\Desktop\\data.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//随机读
	int ch = fgetc(pf);
	printf("%c\n", ch);//a
	long pos = ftell(pf);
	printf("%d\n", pos);//1

	ch = fgetc(pf);
	printf("%c\n", ch);//b
	pos = ftell(pf);
	printf("%d\n", pos);//2


	fclose(pf);
	pf = NULL;
	return 0;
}

(三)rewind

1. rewind函数介绍

void rewind( FILE *stream );//作用是让文件指针的位置回到文件的起始位置

2. 举例

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	FILE* pf =fopen("C:\\Users\\86173\\Desktop\\data.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//随机读
	int ch = fgetc(pf);
	printf("%c\n", ch);//a
	long pos = ftell(pf);
	printf("%d\n", pos);//1

	ch = fgetc(pf);
	printf("%c\n", ch);//b
	pos = ftell(pf);
	printf("%d\n", pos);//2

	rewind(pf);
	pos = ftell(pf);
	printf("%d\n", pos);//0

	fclose(pf);
	pf = NULL;
	return 0;
}

四、文本文件和二进制文件

(一)基本概念

  • 根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
  • 数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
  • 如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件

(二)一个数据在内存中是怎么存储的

  • 字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。
  • 如有整数20000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节 

  

(三)举例(数值型数据)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a = 20000;
	FILE* pf = fopen("C:\\Users\\86173\\Desktop\\data.txt", "wb");
	fwrite(&a, 4, 1, pf);//以二进制形式写到文件中
	fclose(pf);
	pf = NULL;
	return 0;
	
}

(四)举例(字符型数据)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	char ch = 'A';
	FILE* pf = fopen("C:\\Users\\86173\\Desktop\\data.txt", "wb");
	fwrite(&ch, sizeof(ch), 1, pf);//以二进制形式写到文件中
	fclose(pf);
	pf = NULL;
	return 0;
	
}

 

五、文件读取结束的判定(feof)

牢记:在文件读取过程中, 不能用feof函数的返回值 直接用来判断 文件的是否结束
feof的作用是:当 文件读取结束 的时候,判断是读取结束的原因是否是:遇到文件尾结束

 

1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc )或者 NULL ( fgets )

  • fgetc 判断是否为 EOF
  • fgets 判断返回值是否为 NULL 

2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数

  • fread判断返回值是否小于实际要读的个数

3. 举例

#include <stdlib.h>
int main()
{
	int c; // 注意:int,非char,要求处理EOF
	FILE* fp = fopen("C:\\Users\\86173\\Desktop\\各类txt\\data.txt", "r");
	if (!fp) {
		perror("File opening failed");
		return EXIT_FAILURE;
	}
	//fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF
	while ((c = fgetc(fp)) != EOF) 
	{
		putchar(c);
	}
		//判断是什么原因结束的
		if (ferror(fp))
			puts("I/O error when reading");
		else if (feof(fp))
			puts("End of file reached successfully");
	fclose(fp);
	return 0;
}

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值