文件的读写方式(按字符读写、按行读写、按块读写)

打开文件的方式
含义

w:表示fopen文件时会清空掉原文件(如果存在)的信息,并重新写入,在不fclose文件的情况下,多次fwrite也是追加写入到文件末尾的,不会覆盖之前fwrite的内容。

a:表示fopen文件时会保留原文件(如果存在)的信息,并追加到末尾写入,每次fwrite写入到文件末尾。

文本方式打开的文件具有一定的格式,说明读取时是要按照一定的编码规范来读取的,而二进制方式读取是直接从文件中读取包含0,1的二进制流,没有任何格式

“r” 打开,只读
“w” 打开,文件指针指到头,只写
“a” 打开,指向文件尾,在已存在文件中追加
“rb” 打开一个二进制文件,只读
“wb” 打开一个二进制文件,只写
“ab” 打开一个二进制文件,进行追加
“r+” 以读/写方式打开一个已存在的文件
“w+” 以读/写方式建立一个新的文本文件
“a+” 以读/写方式打开一个文件文件进行追加
“rb+” 以读/写方式打开一个二进制文件
“wb+” 以读/写方式建立一个新的二进制文件
“ab+” 以读/写方式打开一个二进制文件进行追加

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <Windows.h>
typedef struct Teacher
{
	char name[64];
	int age;
}teacher;
void fun_fwrite()//按块的方式写文件
{
	int my_count;
	FILE* fp = NULL;//文件句柄,就是一个内存块的首地址
	const char* filename = "C:/Users/ky/Desktop/3.txt";
	Teacher tArray[3];
	for (int i = 0; i < 3; i++)
	{
		sprintf(tArray[i].name,"%d%d%d", i + 1, i + 1, i + 1);
		tArray[i].age = i + 31;
		printf("%s\n", tArray[i].name);
	}

	fp = fopen(filename, "rb+");
	if (fp == NULL)
	{
		printf("func fopen err\n");
		return;
	}
	printf("func fopen right\n");

	for (int i = 0; i < 3; i++)
	{
		my_count=fwrite(&tArray[i], sizeof(Teacher),1, fp);

	}
	
	if (fp != NULL)
	{
		fclose(fp);
	}
}
void fun_fread()//按块的方式读文件
{
	int my_count;
	FILE* fp = NULL;//文件句柄,就是一个内存块的首地址
	const char* filename = "C:/Users/ky/Desktop/3.txt";
	Teacher tArray[3];

	fp = fopen(filename, "rb+");//以二进制读写的方式打开文件
	if (fp == NULL)
	{
		printf("func fopen err\n");
		return;
	}

	printf("func fopen right\n");

	for (int i = 0; i < 3; i++)
	{
		my_count = fread(&tArray[i], sizeof(Teacher), 1, fp);

	}
	for (int i = 0; i < 3; i++)
	{
		printf("name:%s, age:%d \n", tArray[i].name, tArray[i].age);
	}

	if (fp != NULL)
	{
		fclose(fp);
	}
}

void fun_fpuc()//按照字符写文件
{
	FILE* fp = NULL;//文件句柄,就是一个内存块的首地址
	const char* filename = "C:/Users/ky/Desktop/2.txt";
	//const char* filename = "2.txt";
	char a[27] = "afafhafoihfiof";
	fp = fopen(filename, "r+");
	if (fp == NULL)
	{
		printf("func fopen err\n");
		return;
	}
	printf("func fopen right\n");
	for (int i = 0; i < strlen(a); i++)
	{
		fputc(a[i], fp);//按字符读写文件
	}
	if (fp != NULL)
	{
		fclose(fp);
	}
}

void fun_fgetc()//按照字符写文件
{
	FILE* fp = NULL;//文件句柄,就是一个内存块的首地址
	const char* filename = "C:/Users/ky/Desktop/2.txt";
	//const char* filename = "2.txt";
	char a[27] = "afafhafoihfiof";
	fp = fopen(filename, "r+");
	if (fp == NULL)
	{
		printf("func fopen err\n");
		return;
	}
	printf("func fopen right\n");
	while (!feof(fp))//feof()是检测流上的文件结束符的函数,如果文件结束,则返回非0值,否则返回0
	{
		char tec = fgetc(fp);
		Sleep(1);
		printf("%c", tec);

	}
	if (fp != NULL)
	{
		fclose(fp);
	}
}

//fputs(a,fd)  按行写
//fgets(buf ,n,fd)  按行读,  一次一行的copy数据 到buf指针所指的内存空间  并变成c风格的字符串 把/n也拷贝到buf中
int main()
{
	//fun_fpuc();
//	fun_fgetc();
	fun_fwrite();
	fun_fread();
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值