文件操作小项目

文件操作小项目

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<Windows.h>
void Add();
void print();
void index();
void research();
void Delete();
void my_sort();
void my_auto();
void title();
#define N 10
struct Student{
	char id[20];
	char name[20];
	int chinese;
	int math;
	int english;
	double average;
};
int main()
{
	my_auto();
	while (1)
	{
		title();
		int n;
		scanf("%d", &n);
		getchar();
		switch (n)
		{
		case 0:
			printf("确认退出? Y/N\n");
			char a;
			scanf("%c", &a);
			if (a == 'Y')
				return 0;
			break;
		case 1:
			research();
			break;
		case 2:
			index();
			break;
		case 3:
			Delete();
			break;
		case 4:
			my_sort();
			break;
		case 5:
			print();
			break;
		default:
			printf("输入错误\n");
		}
		printf("按回车键退出\n");
		getchar();
		Sleep(1000);
	}
	return 0;
}

void title()
{
	printf("*****************************************************************\n");
	printf("*****************************************************************\n");
	printf("***                                                           ***\n");
	printf("***                                                           ***\n");
	printf("***          查询给定学号的学生信息    请按  1                ***\n");
	printf("***          在序号i后插入一信息       请按  2                ***\n");
	printf("***          删除给定学号的学生信息    请按  3                ***\n");
	printf("***          排序                      请按  4                ***\n");
	printf("***          输出显示                  请按  5                ***\n");
	printf("***          退出                      请按  0                ***\n");
	printf("***                                                           ***\n");
	printf("***                                                           ***\n");
	printf("*****************************************************************\n");
	printf("*****************************************************************\n");
}
void print()
{
	FILE* fp = fopen("test.txt", "r+");
	if (fp == NULL)
	{
		printf("open error");
		exit(0);
	}

	struct Student s;
	fscanf(fp, "%s %s %d %d %d %lf", s.id, s.name, &(s.chinese), &(s.math), &(s.english), &(s.average));
	while (!feof(fp))                                                                                                                                                            
	{
		//在读完最后一个串后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。
		//直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多输出了一个-1.
		printf("%-14s%-10s%-8d%-8d%-8d%-8.2lf\n", s.id, s.name, s.chinese, s.math, s.english, s.average);
		fscanf(fp, "%s %s %d %d %d %lf", s.id, s.name, &(s.chinese), &(s.math), &(s.english), &(s.average));
	}
	fclose(fp);
}


void Add()
{
	FILE* fp = fopen("test.txt", "a");
	if (fp == NULL)
	{
		printf("open error");
		exit(0);
	}
	struct Student s;
	printf("输入几位信息:\n");
	int num;
	scanf("%d", &num);
	if (num == 0)
		return;
	printf("请以此输入学生信息:\nId\t\tName\tChinese\tMath\tEnglish\n");
	for (int i = 0; i < num; i++)
	{
		scanf("%s %s %d %d %d", s.id, s.name, &(s.chinese), &(s.math), &(s.english));
		s.average = (s.chinese + s.math + s.english) / 3.0;
		fprintf(fp, "%-14s%-10s%-8d%-8d%-8d%-8.2lf\n", s.id, s.name, s.chinese, s.math, s.english, s.average);
		printf("添加完成\n");
	}
	fclose(fp);
}


void Delete()
{
	struct Student tmp;
	FILE* p = fopen("test.txt", "r+");
	int n = 0;//读取数据。查询记录数据条数
	fscanf(p, "%s %s %d %d %d %lf", tmp.id, tmp.name, &(tmp.chinese), &(tmp.math), &(tmp.english), &(tmp.average));
	for (; !feof(p); n++)
			fscanf(p, "%s %s %d %d %d %lf", tmp.id, tmp.name, &(tmp.chinese), &(tmp.math), &(tmp.english), &(tmp.average));
			
	rewind(p);
	struct Student* pp = (struct Student*)malloc(sizeof(struct Student) * n);
	printf("输入删除学号:\n");
	char str[20];
	scanf("%s", str);
	for (int i = 0; !feof(p); i++)
	//记录删除以外的数据
	{
		fscanf(p, "%s %s %d %d %d %lf", pp[i].id, pp[i].name, &(pp[i].chinese), &(pp[i].math), &(pp[i].english), &(pp[i].average));
		if (strcmp(str, pp[i].id) == 0)
			i--;
	}
	fclose(p);
	
	FILE* fp = fopen("test.txt", "w+");
	//以w+方式打开文件会将原数据删除,然后用记录数据写入
	if (fp == NULL)
	{
		printf("open error");
		exit(0);
	}
	for(int i=0;i<n-1;i++)
		fprintf(fp, "%-14s%-10s%-8d%-8d%-8d%-8.2lf\n", pp[i].id, pp[i].name, pp[i].chinese, pp[i].math, pp[i].english, pp[i].average);
	fclose(fp);
	printf("删除成功\n");
}

void research()
{

	FILE* fp = fopen("test.txt", "r+");
	if (fp == NULL)
	{
		printf("open error");
		exit(0);
	}
	printf("输入查询学号:\n");
	char str[20];
	scanf("%s", str);
	struct Student s;
	for (;!feof(fp);)
	{
		fscanf(fp, "%s %s %d %d %d %lf", s.id, s.name, &(s.chinese), &(s.math), &(s.english), &(s.average));
		if (strcmp(s.id, str) == 0)
		{
			printf("%s %s %d %d %d %.2lf\n", s.id, s.name, s.chinese, s.math, s.english, s.average);
			break;
		}
	}
	if (feof(fp))
		printf("无该同学信息");
	fclose(fp);
}

void index()
{
	struct Student tmp;
	FILE* p = fopen("test.txt", "r+");
	int n = 0;
	fscanf(p, "%s %s %d %d %d %lf", tmp.id, tmp.name, &(tmp.chinese), &(tmp.math), &(tmp.english), &(tmp.average));
	for (; !feof(p); n++)
		fscanf(p, "%s %s %d %d %d %lf", tmp.id, tmp.name, &(tmp.chinese), &(tmp.math), &(tmp.english), &(tmp.average));
	rewind(p);
	struct Student* pp = (struct Student*)malloc(sizeof(struct Student) * (n+1));
	printf("输入增加序号:\n");
	int a;
	scanf("%d", &a);
	for (int i = 0; !feof(p); i++)
	{
		if (i+1 == a)
		{
			printf("请以此输入学生信息:\nId\t\tName\tChinese\tMath\tEnglish\n");
			scanf("%s %s %d %d %d", pp[i].id, pp[i].name, &(pp[i].chinese), &(pp[i].math), &(pp[i].english));
			pp[i].average = (pp[i].chinese + pp[i].math + pp[i].english) / 3.0;
			i++;
		}
		fscanf(p, "%s %s %d %d %d %lf", pp[i].id, pp[i].name, &(pp[i].chinese), &(pp[i].math), &(pp[i].english), &(pp[i].average));			
	}
	fclose(p);
	FILE* fp = fopen("test.txt", "w+");
	if (fp == NULL)
	{
		printf("open error");
		exit(0);
	}
	for (int i = 0; i < n +1; i++)
		fprintf(fp, "%-14s%-10s%-8d%-8d%-8d%-8.2lf\n", pp[i].id, pp[i].name, pp[i].chinese, pp[i].math, pp[i].english, pp[i].average);
	fclose(fp);
	printf("添加完成\n");

}

void my_sort()
{
	struct Student tmp;
	FILE* p = fopen("test.txt", "r+");
	int n = 0;//读取数据。查询记录数据条数
	fscanf(p, "%s %s %d %d %d %lf", tmp.id, tmp.name, &(tmp.chinese), &(tmp.math), &(tmp.english), &(tmp.average));
	for (; !feof(p); n++)
		fscanf(p, "%s %s %d %d %d %lf", tmp.id, tmp.name, &(tmp.chinese), &(tmp.math), &(tmp.english), &(tmp.average));
		
	rewind(p);
	struct Student* pp = (struct Student*)malloc(sizeof(struct Student) * n);
	for(int i=0;!feof(p);i++)
	//数据读出
	{
		fscanf(p, "%s %s %d %d %d %lf", pp[i].id, pp[i].name, &(pp[i].chinese), &(pp[i].math), &(pp[i].english), &(pp[i].average));
	}
	fclose(p);

	//排序
	for (int i = 0; i < n ; i++)
	{
		for (int j = 0; j < n - 1 - i; j++)
		{
			if (pp[j].average < pp[j + 1].average)
			{
				tmp = pp[j];
				pp[j] = pp[j + 1];
				pp[j + 1] = tmp;
			}
		}
	}
	
	FILE* fp = fopen("test.txt", "w+");
	//写入
	if (fp == NULL)
	{
		printf("open error");
		exit(0);
	}
	for (int i = 0; i < n; i++)
		fprintf(fp, "%s %s %d %d %d %.2lf\n", pp[i].id, pp[i].name, pp[i].chinese, pp[i].math, pp[i].english, pp[i].average);
	fclose(fp);
}


void my_auto()
//自动生成十个数据并写入文件
{
	struct Student tail[N];
	srand((unsigned int)time(NULL));
	for (int i = 0; i < N; i++)
	{
		tail[i].id[0] = '2', tail[i].id[1] = '0', tail[i].id[2] = '2', tail[i].id[3] = '0';
		while (1)
		{
			for (int j = 4; j < 11; j++)
				tail[i].id[j] = rand() % 10 + '0';
			tail[i].id[11] = '\0';

			int sameornot = false;
			for (int n = 0; n < i; n++)
				if (strcmp(tail[n].id, tail[i].id) == 0)
				{
					sameornot = true;
					break;
				}
			if (!sameornot)
				break;
		}

		for (int j = 0; j < 5; j++)
			tail[i].name[j] = rand() % 26 + 'A';
		tail[i].name[5] = '\0';



		tail[i].chinese = rand() % 61 + 40;
		tail[i].math = rand() % 61 + 40;
		tail[i].english = rand() % 61 + 40;
		tail[i].average = (tail[i].chinese + tail[i].math + tail[i].english) / 3.0;
	}
	FILE* fp = fopen("test.txt", "w+");
	if (fp == NULL)
	{
		printf("open error");
		exit(0);
	}
	for (int i = 0; i < N; i++)
		fprintf(fp, "%s %s %d %d %d %.2lf\n", tail[i].id, tail[i].name, tail[i].chinese, tail[i].math, tail[i].english, tail[i].average);
	fclose(fp);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「 25' h 」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值