C语言--文件操作

什么是文件

文件名

文件名是一个唯一的文件标识,一般包含三个部分:文件路径+文件名主干+后缀名
例如我们的C语言源文件main.c

文件的打开和关闭

文件指针

每一个被使用的文件都在内存中开辟一个相对应的文件信息去,用于存放文件的相关信息。这些信息都是保存在一个结构体变量中的,在系统中有声明为FILE
创建一个FILE*指针变量可以指向某个文件的文件信息区,通过该文件信息区就可以访问到改文件,也就是说**通过文件指针变量能够找到与它关联的文件

FILE* pf;//创建文件指针变量

打开和关闭文件

在库函数中fopen函数是负责打开文件,fclose是负责关闭文件的
在进行文件操作前我们都应该先打开文件,操作完文件之后一定要记得关闭文件

fopen

FILE * fopen ( const char * filename, const char * mode );
第一个参数为文件指针,第二个是打开文件的方式
打开文件会有很多种方式,例如只读,只写,追加
在这里插入图片描述

#include <stdio.h>
int main ()
{
FILE * pFile;
//打开文件
pFile = fopen("test.txt","w");
}

fclose

打开文件操作完后要关闭文件

fclose(pFile);
pFile=NULL;

文件的顺序读写

fgetc

适用于所有输入流的字符输入函数

int main()
{
	//读一个字符
	//读一次读第一个字符,以此类推
	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);*/
	//int ch = 0;
	while ((ch = fgetc(pf)) != EOF)
		printf("%c\n", ch);

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

fputc

适用于所有输出流的字符输出函数

int main()
{
	//写一行数据
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		//如果失败,打印错误信息
		perror("fopen:");
		return 1;
	}
	fputs("hjb", pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

fgets

适用于所有输入流的文本行输入函数

int main()
{
	//读一行数据
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		//如果失败,打印错误信息
		perror("fopen:");
		return 1;
	}

	char arr[20] = { 0 };
	//'\0'也包括读的个数中
	fgets(arr, 4, pf);
	printf("%s\n", arr);

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

fputs

适用于所有输出流的文本行输出函数

fprintf

适用于所有输出流的格式化输出函数

struct S
{
	char arr[10];
	int age;
	float score;
};
int main()
{
	struct S s = { "zhangsan",25,50.5f };

	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		//如果失败,打印错误信息
		perror("fopen:");
		return 1;
	}

	fprintf(pf, "%s %d %f", s.arr, s.age, s.score);

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

fscanf

适用于所有输入流的格式化输入函数

struct S
{
	char arr[10];
	int age;
	float score;
};
int main()
{
	struct S s = { "zhangsan",25,50.5f };

	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		//如果失败,打印错误信息
		perror("fopen:");
		return 1;
	}

	fscanf(pf, "%s %d %f", s.arr, &(s.age), &(s.score));
	printf("%s %d %f\n", s.arr, s.age, s.score);
	fclose(pf);
	pf = NULL;
	return 0;
}

fread

适用于文件的二进制输入

struct S
{
	char arr[10];
	int age;
	float score;
};
int main()
{
	//读二进制文件
	struct S s = { 0 };

	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		//如果失败,打印错误信息
		perror("fopen:");
		return 1;
	}

	fread(&s, sizeof(s), 1, pf);
	printf("%s %d %0.2f", s.arr, s.age, s.score);
	fclose(pf);
	pf = NULL;
	return 0;
}

fwrite

适用于文件的二进制输出

struct S
{
	char arr[10];
	int age;
	float score;
};
int main()
{
	//二进制写到文件
	struct S s = { "zhangsan",25,50.5f };

	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		//如果失败,打印错误信息
		perror("fopen:");
		return 1;
	}

	fwrite(&s, sizeof(s), 1, pf);

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

文件读取结束的判定

feof

在文件读取过程中,一定不嗯呢该使用feof函数的返回值直接用来判断文件是否结束
而是用于当文件读取结束时,判断文件结束的原因是读取失败还是遇到文件尾结束

  1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
    例如:
    fgetc 判断是否为 EOF .
    fgets 判断返回值是否为 NULL .
  2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
    例如:
    fread判断返回值是否小于实际要读的个数。

文件缓冲区

如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓
冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值