20.10文件操作-代码总结

#include<stdio.h>

void fileOpenAndClose();
void readFileChar();
void writeFileChar();
void readFileStr();
void formatWrite();
void formatRead();
void binaryWrite();
void binaryRead();
void seek();
size_t fileSize(const char* fileName);

void test()
{
	FILE* fp = fopen("test.dat", "wb+");
	if (!fp)
	{
		perror("file open failed");
		return;
	}

	int  size = 1256;
	fwrite(&size, sizeof(int), 1, fp);

	//文件的位置指针
	//1256
	rewind(fp);

	int nsize = 0;
	fread(&nsize, sizeof(int), 1, fp);

	fclose(fp);
}
int main()
{
	//fileOpenAndClose();
	//readFileChar();
	//writeFileChar();
	//readFileStr();
	//formatWrite();
	//formatRead(); 
	//binaryWrite();
	//binaryRead();

	//test();
	//seek();

	size_t size = fileSize("VIP13.txt");
	printf("size %u", size);

	return 0;
}


//文件打开与关闭
void fileOpenAndClose()
{
	//打开文件
	FILE* fp = fopen("C:/Windows/苍老师.txt", "r");
	//判断是否打开成功
	if (fp == NULL)
	{
		//看一下是什么原因导致的错误
		perror("file open failed ");
		return;
	}

	//关闭文件
	fclose(fp);
}

//按字符读取
void readFileChar()
{
	FILE* fp = fopen("demo.txt", "r");
	if (fp == NULL)
	{
		perror("file open failed ");
		return;
	}
	//打开成功开始操作文件

	//从文件中一个一个字符的读取
	//char ch = fgetc(fp);
	//putchar(ch);
	//啥时候结束,EOF

	/* //1,
	while (1)
	{
		char ch = fgetc(fp);
		if (ch == EOF)
		{
			break;
		}
		putchar(ch);
	}*/

	char ch = 0;
	while ((ch = fgetc(fp)) != EOF)
	{
		putchar(ch);
	}

	fclose(fp);
}
void writeFileChar()
{
	FILE* fp = fopen("demo.txt", "a");
	if (fp == NULL)
	{
		perror("file open failed ");
		return;
	}

	for (int i = 0; i < 26; i++)
	{
		fputc('a' + i, fp);
	}



	fclose(fp);
}


//按字符串读取
void readFileStr()
{
	FILE* fp = fopen("demo.txt", "r+");
	if (!fp)
	{
		perror("open file failed");
		return;
	}

	char buf[512] = { 0 };
	//以字符串形式读取
	while (!feof(fp))
	{
		fgets(buf, 512, fp);
		printf(buf);			//乱码了:编码问题 utf8 -> gbk
	}

	//char* name = "\nFILE* fp = fopen(\"demo.txt\", \"r\");";
	写入字符串
	//int ret = fputs(name, fp);
	//if (ret == EOF)
	//{
	//	perror("\n字符串写入失败");
	//}


	fclose(fp);
}


//学生
typedef struct Student
{
	int id;
	int age;
	char name[10];
}Student;


//格式化读写
void formatWrite()
{
	Student bloom[47] = { {100,22,"bloom" },{1001,19,"逝川"} ,{1002,20,"hello"} ,
		{1003,21,"哈哈哈"}, {1004,18,"幻阳"} };
	//把这个学生信息写入文件
	FILE* fp = fopen("VIP13.dunkai", "w");
	if (!fp)
	{
		perror("file open failed");
		return;
	}

	//写入
	for (int i = 0; i < 5; i++)
	{
		int ret = fprintf(fp, "%d %d %s\n", bloom[i].id, bloom[i].age, bloom[i].name);
		if (ret == EOF)
		{
			perror("write failed");
		}
	}

	fclose(fp);
}
void formatRead()
{
	Student vip[47];
	//把这个学生信息写入文件
	FILE* fp = fopen("VIP13.dunkai", "r");
	if (!fp)
	{
		perror("file open failed");
		return;
	}

	//读
	for (int i = 0; i < 47; i++)
	{
		int ret = fscanf(fp, "%d %d %s", &vip[i].id, &vip[i].age, vip[i].name);
		if (ret == EOF)
		{
			perror("读取错误");
			break;
		}
	}


	fclose(fp);
}

//二进制读写
void binaryWrite()
{
	Student bloom[47] = { {100,22,"bloom" },{1001,19,"逝川"} ,{1002,20,"hello"} ,
		{1003,21,"哈哈哈"}, {1004,18,"幻阳"} };
	FILE* fp = fopen("No.1.dj", "wb");	//二进制读写要用二进制的方式打开文件
	if (!fp)
	{
		perror("file open failed");
		return;
	}

	//二进制写入
	int ret = fwrite(bloom, sizeof(Student), 5, fp);
	printf("write %d block\n", ret);
	if (ferror(fp))
	{
		perror("error ");
	}

	fclose(fp);
}

void binaryRead()
{
	Student vip[10];
	FILE* fp = fopen("No.1.dj", "rb");	//二进制读写要用二进制的方式打开文件
	if (!fp)
	{
		perror("file open failed");
		return;
	}

	//读取二进制数据
	int ret = fread(vip, sizeof(Student), 10, fp);
	printf("ret %d \n", ret);

	fclose(fp);
}


void seek()
{
	FILE* fp = fopen("seek.txt", "w+");
	if (!fp)
	{
		perror("file open failed");
		return;
	}

	fputs("hello", fp);	//写入之后文件位置指针再文件末尾

	//移动文件位置指针
	rewind(fp);				//直接移动到文件头
	fseek(fp, 2, SEEK_SET);
	fseek(fp, -5, SEEK_END);
	fseek(fp, 2, SEEK_CUR);
	long pos = ftell(fp);
	printf("pos %ld\n", pos);

	char buf[512];
	fgets(buf, 512, fp);
	puts(buf);



	fclose(fp);

}



size_t fileSize(const char* fileName)
{
	FILE* fp = fopen(fileName, "r");
	if (!fp)
	{
		return ~0;	//0000 0000	 1111 1111	 
	}
	fseek(fp, 0, SEEK_END);
	size_t size = ftell(fp);

	fclose(fp);
	return size;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值