文件操作的简单操作处理。必定结帖

不吃辣的IT男 2020-03-30 09:00:09

文件操作学的不是很明白,希望能给予帮助;
...全文
945 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
coo135 2020-04-02
  • 打赏
  • 举报
回复
楼主要的作业,拿去参考吧。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 30
typedef struct student {
	long id;
	char name[20];
	int math,chiness,english,total;
} STUDENT;

//主菜单,返回1-6选项;
int menu();
//1:创建学生信息文件并输出,返回学生数量
int create_stu_info();
//2:按学号排序并输出
int sort_by_id(STUDENT* s,int num);
//3:按姓名排序并输出
int sort_by_name(STUDENT* s,STUDENT* s_name,int num);
//4:增加学生信息,返回增加后的学生数量
int insert_stu(STUDENT* s,int num);
//5:删除某学生的数据,返回删除后的学生数量
int delete_stu(STUDENT* s,int num);

//intput/output:读入/输出 num个学生信息;
//fp==NULL时从键盘读入/屏幕输出,否则从文件读/写;
int input(FILE* fp, STUDENT* stu,int num);
void output(FILE* fp,STUDENT* stu,int num);
//排序的比较准则
int cmp_id(const void* lhs,const void* rhs);
int cmp_name(const void* lhs,const void* rhs);
//寻找合适的插入删除位置
int find_id(STUDENT* s,int num,long id);

int main() {
	STUDENT s[N],s_name[N];
	int num=0,ch;
	//根据主菜单,进行相应的操作
	while((ch=menu())!='6') {
		switch (ch) {
			case '1':
				num=create_stu_info();
				break;
			case '2':
				sort_by_id(s,num);
				break;
			case '3':
				sort_by_name(s,s_name,num);
				break;
			case '4':
				num=insert_stu(s,num);
				break;
			case '5':
				num=delete_stu(s,num);
		}
	}
	return 0;
}
//比较规则:按ID 升序 
int cmp_id(const void* lhs,const void* rhs) {
	return ((STUDENT*)lhs)->id>((STUDENT*)rhs)->id;
}
//比较规则:按姓名升序 
int cmp_name(const void* lhs,const void* rhs) {
	int result=strcmp(((STUDENT*)lhs)->name,((STUDENT*)rhs)->name);
	return result>0;
}
//寻找合适的插入删除位置
int find_id(STUDENT* s,int num,long id) {
	int pos;
	for(pos=0; pos<num; ++pos)
		if(s[pos].id>=id)
			break;
	return pos;
}
//从键盘或文件读入 num个学生信息 
int input(FILE* fp,STUDENT* stu,int num) {
	for(int i=0; i<num; ++i) {
		if(fp==NULL) {
			scanf("%ld%s%d%d%d",&stu[i].id,stu[i].name,
			    &stu[i].math,&stu[i].chiness,&stu[i].english);
			stu[i].total=stu[i].math+stu[i].chiness+stu[i].english;
		} else {
			fscanf(fp,"%ld%s%d%d%d%d",&stu[i].id,stu[i].name,
			    &stu[i].math,&stu[i].chiness,&stu[i].english,&stu[i].total);
		}
	}
	return 0;
}
//输出学生信息 
void output(FILE* fp,STUDENT* stu,int num) {
	//如在屏幕上显示则输出标题
	if(fp==NULL)
		printf("\n%10s\t%10s\t数学\t语文\t英语\t总成绩\n","学号","姓名");
	//输出学生信息至屏幕/文件
	for(int i=0; i<num; ++i)
		if(fp==NULL) {
			printf("%010d\t%10s\t%4d\t%4d\t%4d\t%4d\n",stu[i].id,
			    stu[i].name,stu[i].math,stu[i].chiness,stu[i].english,stu[i].total);
		} else {
			fprintf(fp,"%010d\t%10s\t%4d\t%4d\t%4d\t%4d\n",stu[i].id,
			    stu[i].name,stu[i].math,stu[i].chiness,stu[i].english,stu[i].total);
		}
}
//主菜单,返回1-6选项;
int menu() {
	int ch=0;
	printf("\n1:创建学生信息文件并输出\n2:按学号排序并输出\n3:按姓名排序并输出\n4:增加学生信息\n5:删除某学生的数据\n6:退出程序\n");
	printf("请选择:");
	while(ch<'1'||ch>'6')
		ch=getchar();
	return ch;
}
//1:创建学生信息文件并输出,返回学生数量
int create_stu_info() {
	int num;
	STUDENT stu[N];
	FILE* fp=fopen("student.data","w+");
	printf("\n请输入学生数量:");
	scanf("%d",&num);
	printf("请按格式输入:学号\t姓名\t数学\t语文\t英语\n");
	input(NULL,stu,num);//从键盘读入学生信息
	output(fp,stu,num);//保存到文件
	fclose(fp);
	printf("保存成功,学生信息如下:\n");
	output(NULL,stu,num);//在屏幕上显示
	return num;
}
//2:按学号排序并输出
int sort_by_id(STUDENT* s,int num) {
	FILE* fp=fopen("student.data","r");
	printf("\n一共有%d名学生;",num);
	//从文件中读入学生信息到数组s
	input(fp,s,num);
	fclose(fp);
	//按id 排序
	qsort(s,num,sizeof(STUDENT),cmp_id);
	//保存到文件
	fp=fopen("s_no.data","w");
	output(fp,s,num);
	fclose(fp);
	//在屏幕上显示
	printf("按ID排序后的信息如下:\n");
	output(NULL,s,num);
	return 0;
}
//3:按姓名排序并输出
int sort_by_name(STUDENT* s,STUDENT* s_name,int num) {
	//将s复制到s_name
	for(int i=0; i<num; ++i)
		s_name[i]=s[i];
	//按姓名排序
	qsort(s_name,num,sizeof(STUDENT),cmp_name);
	//保存到文件中
	FILE* fp=fopen("s_name.data","w");
	output(fp,s_name,num);
	fclose(fp);
	//在屏幕上显示
	printf("\n按姓名排序后的信息如下:\n");
	output(NULL,s_name,num);
	return 0;
}
//4:增加学生信息,返回增加后的学生数量
int insert_stu(STUDENT* s,int num) {
	STUDENT tmp;
	printf("请按格式输入一名学生信息:学号\t姓名\t数学\t语文\t英语\n");
	//从键盘读入一名学生信息
	input(NULL,&tmp,1);
	//寻找合适的安插位置
	int pos=find_id(s,num,tmp.id);
	//插入学生信息
	for(int i=num; i>pos; --i)
		s[i]=s[i-1];
	s[pos]=tmp;
	++num;
	//在屏幕上显示
	output(NULL,s,num);
	return num;
}
//5:删除某学生的数据
int delete_stu(STUDENT* s,int num) {
	long id;
	printf("请输入需删除的学号:");
	scanf("%ld",&id);
	//按学号查找某学生 
	int pos=find_id(s,num,id);
	//如找到,删除之
	if(s[pos].id==id) {
		for(int i=pos; i<num; ++i)
			s[i]=s[i+1];
		--num;
	} else printf("\n未找到学号为: %d 的学生\n",id);
	//在屏幕上显示 
	output(NULL,s,num);
	return num;
}

自信男孩 2020-04-02
  • 打赏
  • 举报
回复
引用 18 楼 overcomemyself 的回复:
[quote=引用 12 楼 自信男孩 的回复:]
#include<stdio.h>
#include<stdlib.h>
#include <string.h>

#define N 30

typedef struct student
{
long id;
char name[20];
int score[4];
}STUDENT;

void write(STUDENT stu[],int num,int x);
void read(STUDENT s[],int num);
void print(STUDENT s[],int num);
void px(STUDENT s[],int num);
void px_as_name(STUDENT s[],int num);
void copy(STUDENT s[],int num);

int main()
{
STUDENT s[N];
int n,num=5;
printf("1:创建学生信息文件并输出;\n2:按学号排序并输出;\n3:按姓名排序并输出;\n4:增加学生信息;\n5:删除某学生的数据;\n");
do{
scanf("%d",&n);
switch(n)
{
case 1:
read(s,num);
print(s,num);
break;
case 2:
px(s,num);
print(s,num);
break;

case 3:
px_as_name(s,num);
print(s,num);
break;
}
}while(n!=6);
return 0;
}
void write(STUDENT stu[],int num,int x)
{
FILE *fp;
int i,j ;
//if(x=1)
if(x==1)
{
if((fp=fopen("E:\\c语言作业寒假\\student.data","w"))==NULL)
{
printf("错误\n");
exit(0);
}
}
else
{
if((fp=fopen("E:\\c语言作业寒假\\sno.data","w"))==NULL)
{
printf("错误\n");
exit(0);
}
}
for(i=0;i<num;i++)
{
fprintf(fp,"%010ld%8s",stu[i].id,stu[i].name);
for(j=0;j<4;j++)
{
fprintf(fp,"%4d",stu[i].score[j]);
}
fprintf(fp,"\n");
}
fclose(fp);
}
void read(STUDENT s[],int num)
{
FILE *fp;
int i,j;
if((fp=fopen("E:\\c语言作业寒假\\student.data","r"))==NULL)
{
printf("错误\n");
exit(0);
}
for(i=0;i<num;i++)
{
fscanf(fp,"%ld",&s[i].id);
fscanf(fp,"%s",s[i].name);
for(j=0;j<4;j++)
{
fscanf(fp,"%d",&s[i].score[j]);
}
}
fclose(fp);
}
void print(STUDENT s[],int num)
{
int i,j;
printf(" 学号\t\t姓名\t数学\t语文\t英语\t总成绩\n");
for(i=0;i<num;i++)
{
printf("%010ld%10s",s[i].id,s[i].name);
for(j=0;j<4;j++)
{
printf("%8d",s[i].score[j]);
}
printf("\n");
}
}
void px(STUDENT s[],int num)
{
int i,j,k;
STUDENT team;
for(i=0;i<num;i++)
{
k=i;
for(j=i+1;j<num;j++)
{
if(s[k].id>s[j].id)
{
k=j;
}
}
if(k!=i)
{
team=s[i];
s[i]=s[j];
s[j]=team;
}
}
write(s,num,2);
}

void px_as_name(STUDENT s[],int num)
{
int i,j,k;
STUDENT team;
for(i=0;i<num;i++)
{
k=i;
for(j=i+1;j<num;j++)
{
if(strcmp(s[k].name, s[j].name) > 0)
{
k=j;
}
}
if(k!=i)
{
team=s[i];
s[i]=s[j];
s[j]=team;
}
}
write(s,num,2);
}

供参考~

楼主为什么每次都写文件呢?
在内存里保存的就是最新的文件呢?除非增加~

这是你的程序运行结果,还有那个毛病,烫烫烫[/quote]
发一下你的文件内容~
qybao 2020-04-02
  • 打赏
  • 举报
回复
引用 26 楼 overcomemyself 的回复:
我的哪里错了???

你的是选择排序,但是交换的对象不对

void px(STUDENT s[],int num)
{
int i,j,k;
STUDENT team;
for(i=0;i<num;i++)
{
k=i;
for(j=i+1;j<num;j++)
{
if(s[k].id>s[j].id)
{
k=j;
}
}
if(k!=i)
{ //这里不是交换 i 和 j,而是交换 i 和 k
team=s[i];
//s[i]=s[j];
//s[j]=team;
s[i]=s[k];
s[k]=team;
}
}
write(s,num,2);
}

自信男孩 2020-04-01
  • 打赏
  • 举报
回复
建议先自己写写,遇到问题再提出来吧~
不吃辣的IT男 2020-04-01
  • 打赏
  • 举报
回复
引用 25 楼 chxchxkkk 的回复:
[quote=引用 24 楼 overcomemyself 的回复:]
[quote=引用 13 楼 chxchxkkk 的回复:]

void px(STUDENT s[],int num)
{
int i,j,k;
STUDENT team;
for(i=1;i<num;i++)
{
for (k=0; k< num-i; k++)
{
if(s[k].id>s[k+1].id)
{
team=s[k];
s[k]=s[k+1];
s[k+1]=team;
}
write(s,num,2);
}

排序参考一下

兄弟你这排序思路是什么啊?[/quote]
相当 于冒泡排序,只不过把变量换成结构体变量[/quote]
我的哪里错了???
chxchxkkk 2020-04-01
  • 打赏
  • 举报
回复
引用 24 楼 overcomemyself 的回复:
[quote=引用 13 楼 chxchxkkk 的回复:]

void px(STUDENT s[],int num)
{
    int i,j,k;
    STUDENT team;
    for(i=1;i<num;i++)
    {
        for (k=0; k< num-i; k++)
        {
            if(s[k].id>s[k+1].id)
            {                  
                    team=s[k];
                    s[k]=s[k+1];
                    s[k+1]=team;                
        }
    write(s,num,2);
}
排序参考一下
兄弟你这排序思路是什么啊?[/quote] 相当 于冒泡排序,只不过把变量换成结构体变量
不吃辣的IT男 2020-04-01
  • 打赏
  • 举报
回复
引用 13 楼 chxchxkkk 的回复:

void px(STUDENT s[],int num)
{
int i,j,k;
STUDENT team;
for(i=1;i<num;i++)
{
for (k=0; k< num-i; k++)
{
if(s[k].id>s[k+1].id)
{
team=s[k];
s[k]=s[k+1];
s[k+1]=team;
}
write(s,num,2);
}

排序参考一下

兄弟你这排序思路是什么啊?
不吃辣的IT男 2020-04-01
  • 打赏
  • 举报
回复
引用 21 楼 qybao 的回复:
你没include相应的头文件
#include <iostream>
#include <vector>
#include<stdio.h>
#include <stdlib.h>

我去学习学习
不吃辣的IT男 2020-04-01
  • 打赏
  • 举报
回复
引用 14 楼 chxchxkkk 的回复:
[quote=引用 13 楼 chxchxkkk 的回复:]

void px(STUDENT s[],int num)
{
int i,j,k;
STUDENT team;
for(i=1;i<num;i++)
{
for (k=0; k< num-i; k++)
{
if(s[k].id>s[k+1].id)
{
team=s[k];
s[k]=s[k+1];
s[k+1]=team;
}
}
write(s,num,2);
}

排序参考一下

少了一个大 } 号[/quote]
你这个程序是什么排序原则没见过,我用的冒泡应该不错啊
qybao 2020-04-01
  • 打赏
  • 举报
回复
你没include相应的头文件
#include <iostream>
#include <vector>
#include<stdio.h>
#include <stdlib.h>
不吃辣的IT男 2020-04-01
  • 打赏
  • 举报
回复
需要具体代码!!!
不吃辣的IT男 2020-04-01
  • 打赏
  • 举报
回复
引用 14 楼 chxchxkkk 的回复:
[quote=引用 13 楼 chxchxkkk 的回复:]

void px(STUDENT s[],int num)
{
int i,j,k;
STUDENT team;
for(i=1;i<num;i++)
{
for (k=0; k< num-i; k++)
{
if(s[k].id>s[k+1].id)
{
team=s[k];
s[k]=s[k+1];
s[k+1]=team;
}
}
write(s,num,2);
}

排序参考一下

少了一个大 } 号[/quote]
你能告诉我,我的哪出问题了吗?
void px(STUDENT s[],int num)
{
int i,j,k;
STUDENT team;
for(i=0;i<num;i++)
{
k=i;
for(j=i+1;j<num;j++)
{
if(s[k].id>s[j].id)
{
k=j;
}
}
if(k!=i)
{
team=s[i];
s[i]=s[j];
s[j]=team;
}
}
write(s,num,2);
}
不吃辣的IT男 2020-04-01
  • 打赏
  • 举报
回复
引用 17 楼 qybao 的回复:
[quote=引用 15 楼 overcomemyself 的回复:]
我才刚刚学习到这里,还是自学。你这写的太难了

这个不难啊?就是main函数调用一个showMenu显示菜单,然后根据输入的菜单值调用相应的函数
你说难,可能是因为用了vector,用vector的地方改成像你那样用个stu[N]就可以了[/quote]

你的程序在我这运行不起来
不吃辣的IT男 2020-04-01
  • 打赏
  • 举报
回复
引用 12 楼 自信男孩 的回复:
#include<stdio.h>
#include<stdlib.h>
#include <string.h>

#define N 30

typedef struct student
{
long id;
char name[20];
int score[4];
}STUDENT;

void write(STUDENT stu[],int num,int x);
void read(STUDENT s[],int num);
void print(STUDENT s[],int num);
void px(STUDENT s[],int num);
void px_as_name(STUDENT s[],int num);
void copy(STUDENT s[],int num);

int main()
{
STUDENT s[N];
int n,num=5;
printf("1:创建学生信息文件并输出;\n2:按学号排序并输出;\n3:按姓名排序并输出;\n4:增加学生信息;\n5:删除某学生的数据;\n");
do{
scanf("%d",&n);
switch(n)
{
case 1:
read(s,num);
print(s,num);
break;
case 2:
px(s,num);
print(s,num);
break;

case 3:
px_as_name(s,num);
print(s,num);
break;
}
}while(n!=6);
return 0;
}
void write(STUDENT stu[],int num,int x)
{
FILE *fp;
int i,j ;
//if(x=1)
if(x==1)
{
if((fp=fopen("E:\\c语言作业寒假\\student.data","w"))==NULL)
{
printf("错误\n");
exit(0);
}
}
else
{
if((fp=fopen("E:\\c语言作业寒假\\sno.data","w"))==NULL)
{
printf("错误\n");
exit(0);
}
}
for(i=0;i<num;i++)
{
fprintf(fp,"%010ld%8s",stu[i].id,stu[i].name);
for(j=0;j<4;j++)
{
fprintf(fp,"%4d",stu[i].score[j]);
}
fprintf(fp,"\n");
}
fclose(fp);
}
void read(STUDENT s[],int num)
{
FILE *fp;
int i,j;
if((fp=fopen("E:\\c语言作业寒假\\student.data","r"))==NULL)
{
printf("错误\n");
exit(0);
}
for(i=0;i<num;i++)
{
fscanf(fp,"%ld",&s[i].id);
fscanf(fp,"%s",s[i].name);
for(j=0;j<4;j++)
{
fscanf(fp,"%d",&s[i].score[j]);
}
}
fclose(fp);
}
void print(STUDENT s[],int num)
{
int i,j;
printf(" 学号\t\t姓名\t数学\t语文\t英语\t总成绩\n");
for(i=0;i<num;i++)
{
printf("%010ld%10s",s[i].id,s[i].name);
for(j=0;j<4;j++)
{
printf("%8d",s[i].score[j]);
}
printf("\n");
}
}
void px(STUDENT s[],int num)
{
int i,j,k;
STUDENT team;
for(i=0;i<num;i++)
{
k=i;
for(j=i+1;j<num;j++)
{
if(s[k].id>s[j].id)
{
k=j;
}
}
if(k!=i)
{
team=s[i];
s[i]=s[j];
s[j]=team;
}
}
write(s,num,2);
}

void px_as_name(STUDENT s[],int num)
{
int i,j,k;
STUDENT team;
for(i=0;i<num;i++)
{
k=i;
for(j=i+1;j<num;j++)
{
if(strcmp(s[k].name, s[j].name) > 0)
{
k=j;
}
}
if(k!=i)
{
team=s[i];
s[i]=s[j];
s[j]=team;
}
}
write(s,num,2);
}

供参考~

楼主为什么每次都写文件呢?
在内存里保存的就是最新的文件呢?除非增加~

这是你的程序运行结果,还有那个毛病,烫烫烫
qybao 2020-04-01
  • 打赏
  • 举报
回复
引用 15 楼 overcomemyself 的回复:
我才刚刚学习到这里,还是自学。你这写的太难了

这个不难啊?就是main函数调用一个showMenu显示菜单,然后根据输入的菜单值调用相应的函数
你说难,可能是因为用了vector,用vector的地方改成像你那样用个stu[N]就可以了
不吃辣的IT男 2020-04-01
  • 打赏
  • 举报
回复
引用 11 楼 qybao 的回复:
这种都属于简单的操作,就不看你的代码了,给你写个简单的例子参考吧

using namespace std;
typedef struct student {
long long no;
char name[20];
int score[4];
} STU, *PSTU;
void showMenu() {
char menu[5][32] = {
"创建文件",
"学号排序",
"姓名排序",
"插入学生",
"删除学生"
};
for(int i=0; i<5; i++) {
printf("%d %s\n", i+1, menu[i]);
}
printf("请选择菜单(输入0退出): ");
}
void createFile(const char *filename) {
try {
FILE *fp = fopen(filename, "w");
fprintf(fp, "%010lld %s %d %d %d %d\n", 908114007ll, "赵晨", 80, 95, 96, 271);
fprintf(fp, "%010lld %s %d %d %d %d\n", 908114003ll, "王宁", 75, 84, 82, 241);
fprintf(fp, "%010lld %s %d %d %d %d\n", 908114009ll, "赵鑫", 98, 93, 89, 280);
fprintf(fp, "%010lld %s %d %d %d %d\n", 908114013ll, "常松梅", 85, 81, 79, 245);
fprintf(fp, "%010lld %s %d %d %d %d\n", 908114023ll, "郝妮", 25, 75, 65, 165);
fflush(fp);
fclose(fp);
} catch(...) {
printf("create file failed.\n");
}
}
void loadData(const char *filename, vector<STU> &vt) {
try {
FILE *fp = fopen(filename, "r");
while (!feof(fp)) {
STU stu;
fscanf(fp, "%010lld %s %d %d %d %d\n", &stu.no, stu.name, &stu.score[0], &stu.score[1], &stu.score[2], &stu.score[3]);
vt.push_back(stu);
}
} catch (...) {
printf("load file failed.\n");
}
}
int sortByNo(STU s1, STU s2) {
return s1.no < s2.no;

}
int sortByName(STU s1, STU s2) {
return strcmp(s1.name, s2.name);
}
void outputFile(const char *filename, const vector<STU> &vt) {
try {
char buf[256];
FILE *fp = fopen(filename, "w");
for (int i=0; i<vt.size(); i++) {
sprintf(buf, "%010lld %s %d %d %d %d\n", vt[i].no, vt[i].name, vt[i].score[0], vt[i].score[1], vt[i].score[2], vt[i].score[3]);
fprintf(fp, "%s", buf);
}
fflush(fp);
fclose(fp);
} catch (...) {
printf("output file failed.\n");
}
}
void insertData(const STU &stu, vector<STU> &vt) {
vector<STU>::iterator it = vt.begin();
while (it <= vt.end()) {
if ((*it).no > stu.no) break;
it++;
}
if (it > vt.end()) {
vt.push_back(stu);
} else {
vt.push_back(*vt.end());
for (vector<STU>::iterator i=vt.end()-1; i>it; i--) {
*i = *(i-1);
}
*it = stu;
}
}
int deleteData(STU stu, vector<STU> &vt) {
vector<STU>::iterator it = vt.begin();
while (it < vt.end()) {
if ((*it).no == stu.no) break;
it++;
}
if (it == vt.end()) {
printf("delete target not found.\n");
return 0;
}
for (;it<vt.end()-1; it++) {
*it = *(it+1);
}
vt.pop_back();
return 1;
}
void printData(vector<STU> vt) {
for (vector<STU>::iterator it = vt.begin(); it<vt.end(); it++) {
printf("%010lld %s %d %d %d %d\n", (*it).no, (*it).name, (*it).score[0], (*it).score[1], (*it).score[2], (*it).score[3]);
}
printf("\n");
}
int main(int argc, const char * argv[]) {
int n = 1;
char filename[3][128] = {
"/Users/chinuh/student.data",
"/Users/chinuh/s_no.data",
"/Users/chinuh/s_name.data",
};
vector<STU> vt;
STU tmp;
while (n != 0) {
showMenu();
scanf("%d", &n);
switch(n) {
case 0:
break;
case 1:
createFile(filename[0]);
break;
case 2:
if (vt.size() == 0)
loadData(filename[0], vt);
sort(vt.begin(), vt.end(), sortByNo);
outputFile(filename[1], vt);
break;
case 3:
if (vt.size() == 0)
loadData(filename[0], vt);
sort(vt.begin(), vt.end(), sortByName);
outputFile(filename[2], vt);
break;
case 4:
if (vt.size() == 0)
loadData(filename[0], vt);
sort(vt.begin(), vt.end(), sortByNo);
//scanf("%010lld %s %d %d %d %d", &tmp.no, tmp.name, &tmp.score[0], &tmp.score[1], &tmp.score[2], &tmp.score[3]);
tmp = {908114045ll, "李成", 67, 73, 68, 208};
insertData(tmp, vt);
printData(vt);
break;
case 5:
if (vt.size() == 0)
loadData(filename[0], vt);
sort(vt.begin(), vt.end(), sortByNo);
tmp.no = 908114023ll;
if (deleteData(tmp, vt))
printData(vt);
break;
default:
printf("菜单选择错误,请重输!\n");
continue;
}
}
return 0;
}

我们用的是vs2012,你这不是吧?
不吃辣的IT男 2020-04-01
  • 打赏
  • 举报
回复
引用 11 楼 qybao 的回复:
这种都属于简单的操作,就不看你的代码了,给你写个简单的例子参考吧

using namespace std;
typedef struct student {
long long no;
char name[20];
int score[4];
} STU, *PSTU;
void showMenu() {
char menu[5][32] = {
"创建文件",
"学号排序",
"姓名排序",
"插入学生",
"删除学生"
};
for(int i=0; i<5; i++) {
printf("%d %s\n", i+1, menu[i]);
}
printf("请选择菜单(输入0退出): ");
}
void createFile(const char *filename) {
try {
FILE *fp = fopen(filename, "w");
fprintf(fp, "%010lld %s %d %d %d %d\n", 908114007ll, "赵晨", 80, 95, 96, 271);
fprintf(fp, "%010lld %s %d %d %d %d\n", 908114003ll, "王宁", 75, 84, 82, 241);
fprintf(fp, "%010lld %s %d %d %d %d\n", 908114009ll, "赵鑫", 98, 93, 89, 280);
fprintf(fp, "%010lld %s %d %d %d %d\n", 908114013ll, "常松梅", 85, 81, 79, 245);
fprintf(fp, "%010lld %s %d %d %d %d\n", 908114023ll, "郝妮", 25, 75, 65, 165);
fflush(fp);
fclose(fp);
} catch(...) {
printf("create file failed.\n");
}
}
void loadData(const char *filename, vector<STU> &vt) {
try {
FILE *fp = fopen(filename, "r");
while (!feof(fp)) {
STU stu;
fscanf(fp, "%010lld %s %d %d %d %d\n", &stu.no, stu.name, &stu.score[0], &stu.score[1], &stu.score[2], &stu.score[3]);
vt.push_back(stu);
}
} catch (...) {
printf("load file failed.\n");
}
}
int sortByNo(STU s1, STU s2) {
return s1.no < s2.no;

}
int sortByName(STU s1, STU s2) {
return strcmp(s1.name, s2.name);
}
void outputFile(const char *filename, const vector<STU> &vt) {
try {
char buf[256];
FILE *fp = fopen(filename, "w");
for (int i=0; i<vt.size(); i++) {
sprintf(buf, "%010lld %s %d %d %d %d\n", vt[i].no, vt[i].name, vt[i].score[0], vt[i].score[1], vt[i].score[2], vt[i].score[3]);
fprintf(fp, "%s", buf);
}
fflush(fp);
fclose(fp);
} catch (...) {
printf("output file failed.\n");
}
}
void insertData(const STU &stu, vector<STU> &vt) {
vector<STU>::iterator it = vt.begin();
while (it <= vt.end()) {
if ((*it).no > stu.no) break;
it++;
}
if (it > vt.end()) {
vt.push_back(stu);
} else {
vt.push_back(*vt.end());
for (vector<STU>::iterator i=vt.end()-1; i>it; i--) {
*i = *(i-1);
}
*it = stu;
}
}
int deleteData(STU stu, vector<STU> &vt) {
vector<STU>::iterator it = vt.begin();
while (it < vt.end()) {
if ((*it).no == stu.no) break;
it++;
}
if (it == vt.end()) {
printf("delete target not found.\n");
return 0;
}
for (;it<vt.end()-1; it++) {
*it = *(it+1);
}
vt.pop_back();
return 1;
}
void printData(vector<STU> vt) {
for (vector<STU>::iterator it = vt.begin(); it<vt.end(); it++) {
printf("%010lld %s %d %d %d %d\n", (*it).no, (*it).name, (*it).score[0], (*it).score[1], (*it).score[2], (*it).score[3]);
}
printf("\n");
}
int main(int argc, const char * argv[]) {
int n = 1;
char filename[3][128] = {
"/Users/chinuh/student.data",
"/Users/chinuh/s_no.data",
"/Users/chinuh/s_name.data",
};
vector<STU> vt;
STU tmp;
while (n != 0) {
showMenu();
scanf("%d", &n);
switch(n) {
case 0:
break;
case 1:
createFile(filename[0]);
break;
case 2:
if (vt.size() == 0)
loadData(filename[0], vt);
sort(vt.begin(), vt.end(), sortByNo);
outputFile(filename[1], vt);
break;
case 3:
if (vt.size() == 0)
loadData(filename[0], vt);
sort(vt.begin(), vt.end(), sortByName);
outputFile(filename[2], vt);
break;
case 4:
if (vt.size() == 0)
loadData(filename[0], vt);
sort(vt.begin(), vt.end(), sortByNo);
//scanf("%010lld %s %d %d %d %d", &tmp.no, tmp.name, &tmp.score[0], &tmp.score[1], &tmp.score[2], &tmp.score[3]);
tmp = {908114045ll, "李成", 67, 73, 68, 208};
insertData(tmp, vt);
printData(vt);
break;
case 5:
if (vt.size() == 0)
loadData(filename[0], vt);
sort(vt.begin(), vt.end(), sortByNo);
tmp.no = 908114023ll;
if (deleteData(tmp, vt))
printData(vt);
break;
default:
printf("菜单选择错误,请重输!\n");
continue;
}
}
return 0;
}

我才刚刚学习到这里,还是自学。你这写的太难了
chxchxkkk 2020-04-01
  • 打赏
  • 举报
回复
引用 13 楼 chxchxkkk 的回复:

void px(STUDENT s[],int num)
{
    int i,j,k;
    STUDENT team;
    for(i=1;i<num;i++)
    {
        for (k=0; k< num-i; k++)
        {
            if(s[k].id>s[k+1].id)
            {                  
                    team=s[k];
                    s[k]=s[k+1];
                    s[k+1]=team;  
            }              
        }
    write(s,num,2);
}
排序参考一下
少了一个大 } 号
chxchxkkk 2020-04-01
  • 打赏
  • 举报
回复

void px(STUDENT s[],int num)
{
    int i,j,k;
    STUDENT team;
    for(i=1;i<num;i++)
    {
        for (k=0; k< num-i; k++)
        {
            if(s[k].id>s[k+1].id)
            {                  
                    team=s[k];
                    s[k]=s[k+1];
                    s[k+1]=team;                
        }
    write(s,num,2);
}
排序参考一下
自信男孩 2020-04-01
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
#include <string.h>

#define N 30

typedef struct student
{
long id;
char name[20];
int score[4];
}STUDENT;

void write(STUDENT stu[],int num,int x);
void read(STUDENT s[],int num);
void print(STUDENT s[],int num);
void px(STUDENT s[],int num);
void px_as_name(STUDENT s[],int num);
void copy(STUDENT s[],int num);

int main()
{
STUDENT s[N];
int n,num=5;
printf("1:创建学生信息文件并输出;\n2:按学号排序并输出;\n3:按姓名排序并输出;\n4:增加学生信息;\n5:删除某学生的数据;\n");
do{
scanf("%d",&n);
switch(n)
{
case 1:
read(s,num);
print(s,num);
break;
case 2:
px(s,num);
print(s,num);
break;

case 3:
px_as_name(s,num);
print(s,num);
break;
}
}while(n!=6);
return 0;
}
void write(STUDENT stu[],int num,int x)
{
FILE *fp;
int i,j ;
//if(x=1)
if(x==1)
{
if((fp=fopen("E:\\c语言作业寒假\\student.data","w"))==NULL)
{
printf("错误\n");
exit(0);
}
}
else
{
if((fp=fopen("E:\\c语言作业寒假\\sno.data","w"))==NULL)
{
printf("错误\n");
exit(0);
}
}
for(i=0;i<num;i++)
{
fprintf(fp,"%010ld%8s",stu[i].id,stu[i].name);
for(j=0;j<4;j++)
{
fprintf(fp,"%4d",stu[i].score[j]);
}
fprintf(fp,"\n");
}
fclose(fp);
}
void read(STUDENT s[],int num)
{
FILE *fp;
int i,j;
if((fp=fopen("E:\\c语言作业寒假\\student.data","r"))==NULL)
{
printf("错误\n");
exit(0);
}
for(i=0;i<num;i++)
{
fscanf(fp,"%ld",&s[i].id);
fscanf(fp,"%s",s[i].name);
for(j=0;j<4;j++)
{
fscanf(fp,"%d",&s[i].score[j]);
}
}
fclose(fp);
}
void print(STUDENT s[],int num)
{
int i,j;
printf(" 学号\t\t姓名\t数学\t语文\t英语\t总成绩\n");
for(i=0;i<num;i++)
{
printf("%010ld%10s",s[i].id,s[i].name);
for(j=0;j<4;j++)
{
printf("%8d",s[i].score[j]);
}
printf("\n");
}
}
void px(STUDENT s[],int num)
{
int i,j,k;
STUDENT team;
for(i=0;i<num;i++)
{
k=i;
for(j=i+1;j<num;j++)
{
if(s[k].id>s[j].id)
{
k=j;
}
}
if(k!=i)
{
team=s[i];
s[i]=s[j];
s[j]=team;
}
}
write(s,num,2);
}

void px_as_name(STUDENT s[],int num)
{
int i,j,k;
STUDENT team;
for(i=0;i<num;i++)
{
k=i;
for(j=i+1;j<num;j++)
{
if(strcmp(s[k].name, s[j].name) > 0)
{
k=j;
}
}
if(k!=i)
{
team=s[i];
s[i]=s[j];
s[j]=team;
}
}
write(s,num,2);
}

供参考~

楼主为什么每次都写文件呢?
在内存里保存的就是最新的文件呢?除非增加~
加载更多回复(8)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧