文件操作小项目
#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);
}