首页 新闻 会员 周边

C语言运用指针修改csv文件的某行某列信息

0
[待解决问题]

我在写一个学生信息管理cpp。望各位大佬帮帮忙

yunye2046的主页 yunye2046 | 菜鸟二级 | 园豆:202
提问于:2022-01-18 09:08
< >
分享
所有回答(2)
0

Qt就可以一行一行读写文件

echo_lovely | 园豆:1433 (小虾三级) | 2022-01-18 09:18

大哥,我们学校还没有讲到指针就放假了,能麻烦您跟我讲讲Qt是什么。
这是我的代码:

include<stdio.h>

include<string.h>

include<stdlib.h>

define N 100

struct Student
{
int num;
char name[N];
char sex[N];
int age;
char hr[N];
float tel;
}stu[N];
struct Student empty[N];
int main()
{
void open(struct Student stu[],int n);
void query(struct Student stu[],int n);
void insert(struct Student stu[],int n);
void delete_stu(struct Student stu[],int n);
void save(struct Student stu[],int n);
int n;
n=N;
int num;
printf("|-----------------------------------------------|\n");
printf("| 欢迎使用学生信息管理系统 |\n");
printf("|-----------------------------------------------|\n");
printf("|1.打开已有学生信息 | 4.删除学生信息 |\n");
printf("|-----------------------------------------------|\n");
printf("|2.查询学生信息 | 5.修改学生信息 |\n");
printf("|-----------------------------------------------|\n");
printf("|3.插入学生信息 | 6.保存所有数据 |\n");
printf("|-----------------------------------------------|\n");
printf("|**********************************| 0.退出系统 |\n");
printf("|-----------------------------------------------|\n");
printf("请输入您选择的操作:");
while(scanf("%d",&num)!=EOF)
switch(num)
{
case 1:open(stu,n);break; //打开已有学生信息
case 2:query(stu,n);break; //查询学生信息
case 3:insert(stu,n);break; //插入学生信息
case 5:delete_stu(stu,n);break; //删除学生信息
case 6:save(stu,n);break; //保存所有数据
case 0:
{
printf("欢迎使用本系统!\n");
return 0;
break;
}
}

}
void open(struct Student stu[],int n)
{
int i,j;
FILE fp;
if((fp=fopen("student.csv","r"))NULL)
{
printf("读取失败 !\n");
exit(0);
}
else
{ for(i=0;i<n;i++)
{
fscanf(fp,"%d,%[,],%[,],%d,%[^,],%f\n",&stu[i].num,stu[i].name,stu[i].sex,&stu[i].age
,stu[i].hr,&stu[i].tel);
if(stu[i].num
0)
break;
}
fclose(fp);
printf("\n");
printf("|---------------------------------------------------------|\n");
printf("| 学号 | 姓名 | 性别 | 年龄 | 生源地 | 联系电话 |\n");
printf("|---------------------------------------------------------|\n");
for(j=0;j<i;j++)
{
printf("|%d| %s | %s | %d | %s |%0.0f |\n",
stu[j].num,stu[j].name,stu[j].sex,stu[j].age,stu[j].hr,stu[j].tel);
printf("|---------------------------------------------------------|\n");
}
}
printf("|-----------------------------------------------|\n");
printf("| 欢迎使用学生信息管理系统 |\n");
printf("|-----------------------------------------------|\n");
printf("|1.打开已有学生信息 | 4.删除学生信息 |\n");
printf("|-----------------------------------------------|\n");
printf("|2.查询学生信息 | 5.修改学生信息 |\n");
printf("|-----------------------------------------------|\n");
printf("|3.插入学生信息 | 6.保存所有数据 |\n");
printf("|-----------------------------------------------|\n");
printf("|
| 0.退出系统 |\n");
printf("|-----------------------------------------------|\n");
printf("请输入您选择的操作:");
}
void query(struct Student stu[],int n)
{
int i,k,num;
char name[20];
int j;
printf("您想继续么?\t(1.继续,-1.退出)\n");
scanf("%d",&j);
while(j!=-1)
{
FILE fp;
if((fp=fopen("student.csv","r"))NULL)
{
printf("读取失败 !\n");
exit(0);
}
for(i=0;i<n;i++)
{
fscanf(fp,"%d,%[,],%[,],%d,%[^,],%f\n",&stu[i].num,stu[i].name,stu[i].sex,&stu[i].age
,stu[i].hr,&stu[i].tel);
}
fclose(fp);
printf("请选择按姓名查找还是按学号查找\n");
printf("|---------------------------|\n");
printf("|1.姓名 | 2.学号 |\n");
printf("|---------------------------|\n");
scanf("%d",&k);
if(k
1)
{
printf("输入您要查找的姓名:\n");
scanf("%s",name);
for(i=0;i<n;i++)
if(strcmp(stu[i].name ,name)0)
break;
if(i<n)
{
printf("已查到,数据为!\n");
printf("|---------------------------------------------------------|\n");
printf("| 学号 | 姓名 | 性别 | 年龄 | 生源地 | 联系电话 |\n");
printf("|---------------------------------------------------------|\n");
printf("|%d| %s | %s | %d | %s |%0.0f |\n",
stu[i].num,stu[i].name,stu[i].sex,stu[i].age,stu[i].hr,stu[i].tel);
printf("|---------------------------------------------------------|\n");
}
else
printf("查无此人\n");
printf("您想继续吗?\t(1.继续,-1.返回系统)\n");
scanf("%d",&j);
}
else if(k
2)
{
printf("输入您要查找的学号:\n");
scanf("%d",&num);
for(i=0;i<n;i++)
if(stu[i].num==num)
break;
if(i<n)
{
printf("已查到,数据为!\n");
printf("|---------------------------------------------------------|\n");
printf("| 学号 | 姓名 | 性别 | 年龄 | 生源地 | 联系电话 |\n");
printf("|---------------------------------------------------------|\n");
printf("|%d| %s | %s | %d | %s |%0.0f |\n",
stu[i].num,stu[i].name,stu[i].sex,stu[i].age,stu[i].hr,stu[i].tel);
printf("|---------------------------------------------------------|\n");
}
else
printf("查无此人\n");
printf("您想继续吗?\t(1.继续,-1.返回系统)\n");
scanf("%d",&j);
}
else
printf("输入错误!");
}
printf("|-----------------------------------------------|\n");
printf("| 欢迎使用学生信息管理系统 |\n");
printf("|-----------------------------------------------|\n");
printf("|1.打开已有学生信息 | 4.删除学生信息 |\n");
printf("|-----------------------------------------------|\n");
printf("|2.查询学生信息 | 5.修改学生信息 |\n");
printf("|-----------------------------------------------|\n");
printf("|3.插入学生信息 | 6.保存所有数据 |\n");
printf("|-----------------------------------------------|\n");
printf("|
| 0.退出系统 |\n");
printf("|-----------------------------------------------|\n");
printf("请输入您选择的操作:");
}
void insert(struct Student stu[],int n)
{
void open(struct Student stu[],int n);
void save(struct Student stu[],int n);
FILE *fp;
int j=0,i,k;
printf("您想继续吗?\t(1.继续,-1.返回系统)\n");
scanf("%d",&j);
while(j!=-1)
{
if((fp=fopen("student.csv","a+"))==NULL)
{
printf("建立失败!\n");
exit(0);
}
else
{
printf("您需要录入几个个学生信息:");
scanf("%d",&k);
printf("\n");
for(i=0;i<k;i++)
{
printf("学号:");
scanf("%d",&stu[i].num);
getchar();
printf("姓名: ");
scanf("%s",stu[i].name);
getchar();
printf("性别: ");
scanf("%s",stu[i].sex);
getchar();
printf("年龄: ");
scanf("%d",&stu[i].age);
getchar();
printf("生源地: ");
scanf("%s",stu[i].hr);
getchar();
printf("通讯录(电话): ");
scanf("%f",&stu[i].tel);
printf("\n");

		}
		for(i=0;i<k;i++)
			printf("%d %s %s %d %s %0.0f\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].age,stu[i].hr,stu[i].tel);
		printf("你想继续吗?(1.继续,-1.返回上一级)\n"); 
        scanf("%d",&j);
	}
}
j=0;
printf("是否保存?(1.是,-1.否):");
scanf("%d",&j);
if(j==1)
	save(stu,k);
for(i=0;i<k;i++)
	printf("%d %s %s %d %s %0.0f\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].age,stu[i].hr,stu[i].tel);
fclose(fp);

}
void delete_stu(struct Student stu[],int n)
{
void save(struct Student stu[],int n);
int i,item,k,m;
char name_1[20],name,sex,hr;
int num,age,tel;
int p;
FILE fp;
if((fp=fopen("student.csv","r"))NULL)
{
printf("读取失败 !\n");
exit(0);
}
else
{
for(i=0;i<n;i++)
{
fscanf(fp,"%d,%[,],%[,],%d,%[^,],%f\n",&stu[i].num,stu[i].name,stu[i].sex,&stu[i].age
,stu[i].hr,&stu[i].tel);
if(stu[i].num
0)
break;
}
}
printf("请选择按姓名查找还是按学号查找\n");
printf("|---------------------------|\n");
printf("|1.姓名 | 2.学号 |\n");
printf("|---------------------------|\n");
scanf("%d",&k);
if(k1)
{
printf("请输入您要修改学生的姓名:");
scanf("%s",name_1);
for (i=0;i<n;i++)
if (strcmp(stu[i].name ,name_1)
0)
break;
}
else if(k2)
{
printf("请输入您要修改学生的学号:");
scanf("%d", &num);
for (i=0;i<n;i++)
if (stu[i].num == num)
break;
}
else
printf("输入错误!");
printf("你想继续吗?(1.继续,-1.返回上一级)\n");
scanf("%d",&k);
while (k
1)
{
printf("|-----------------------------------------------|\n");
printf("| 欢迎使用学生信息管理系统 |\n");
printf("|-----------------------------------------------|\n");
printf("|1.修改学生学号 | 4.修改学生年龄 |\n");
printf("|-----------------------------------------------|\n");
printf("|2.修改学生姓名 | 5.修改学生生源地 |\n");
printf("|-----------------------------------------------|\n");
printf("|3.修改学生性别 | 6.修改学生电话 |\n");
printf("|-----------------------------------------------|\n");
printf("|
**************************| 0.退出系统 |\n");
printf("|-----------------------------------------------|\n");
printf("请输入您要修改内容的选项:");
scanf("%d", &item);
switch (item)
{
case 1:printf("请输入该学生正确的学号:");
scanf("%d", &num);
break;
case 2:printf("请输入该学生正确的姓名:");
scanf("%s",name);
break;
case 3:printf("请输入该学生正确的性别:");
scanf("%s",sex);
break;
case 4:printf("请输入该学生正确的年龄:");
scanf("%d", &age);
break;
case 5:printf("请输入该学生正确的生源地:");
scanf("%s", &hr);
break;
case 6:printf("请输入该学生正确的电话:");
scanf("%f", &tel);
break;
case 0:printf("感谢您的使用!\n");break;
}
printf("你想继续吗?(1.继续,-1.返回上一级)\n");
scanf("%d",&k);
}
m=0;
printf("是否保存?(1.是,-1.否)😊;
scanf("%d",&m);
if(m1)
{
if((fp=fopen("student.csv","r+"))
NULL)
{
printf(" 保存失败 !\n");
exit(0);
}
else
{
p=(int
)&stu;
p=num;
p++;
strcpy(
(char
)p,name);
p++;
strcpy(
(char
)p,sex);
p++;
(int)p=age;
p++;
strcpy(
(char
)p,hr);
p++;
(int)p=tel;

		/*fprintf(fp,"%d,",&stu[i].num);
		fprintf(fp,"%s,",stu[i].name);
		fprintf(fp,"%s,",stu[i].sex);
		fprintf(fp,"%d,",&stu[i].age);
		fprintf(fp,"%s,",stu[i].hr);
		fprintf(fp,"%0.0f\t",&stu[i].tel);
		printf("保存成功!\n");*/
	}
}	
fclose(fp);

}
void save(struct Student stu[],int n)
{
FILE fp;
int i;
if((fp=fopen("student.csv","a+"))==NULL)
{
printf(" 保存失败 !\n");
exit(0);
}
else
{
rewind(fp);
for(i=0;i<n;i++)
{
fprintf(fp,"%d,%s,%s,%d,%s,%0.0f\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].age,stu[i].hr,stu[i].tel);
/
fprintf(fp,"%d,",2020112190);
fprintf(fp,"%s,",stu[i].name);
fprintf(fp,"%s,",stu[i].sex);
fprintf(fp,"%d,",&stu[i].age);
fprintf(fp,"%s,",stu[i].hr);
fprintf(fp,"%0.0f\n",&stu[i].tel);/
}
}
fclose(fp);
printf("保存成功\n");
printf("|-----------------------------------------------|\n");
printf("| 欢迎使用学生信息管理系统 |\n");
printf("|-----------------------------------------------|\n");
printf("|1.打开已有学生信息 | 4.删除学生信息 |\n");
printf("|-----------------------------------------------|\n");
printf("|2.查询学生信息 | 5.修改学生信息 |\n");
printf("|-----------------------------------------------|\n");
printf("|3.插入学生信息 | 6.保存所有数据 |\n");
printf("|-----------------------------------------------|\n");
printf("|
*********************************| 0.退出系统 |\n");
printf("|-----------------------------------------------|\n");
printf("请输入您选择的操作:");
}

支持(0) 反对(0) yunye2046 | 园豆:202 (菜鸟二级) | 2022-01-18 09:33

@yunye2046: 没讲完都有作业了吗?

支持(0) 反对(0) echo_lovely | 园豆:1433 (小虾三级) | 2022-01-18 09:38

@yunye2046: 对于文件存信息的结构,我一般都是采用笨办法。直接全读,读到对应的数据结构中,然后修改,修改完覆盖写回文件。全读全写不会有操作某一行的问题

支持(0) 反对(0) echo_lovely | 园豆:1433 (小虾三级) | 2022-01-18 09:41

@yunye2046: 小文件可以这么整,要是文件超过百兆就不建议了,慢
建议搜下 C 语言按行读写文件

支持(0) 反对(0) echo_lovely | 园豆:1433 (小虾三级) | 2022-01-18 09:42

@echo_lovely: 好的,谢谢了。我在下去看看

支持(0) 反对(0) yunye2046 | 园豆:202 (菜鸟二级) | 2022-01-18 09:46
0

如果读写通用已知格式文件,直接GitHub,我找到了一个,希望对你有帮助:https://github.com/ben-strasser/fast-cpp-csv-parser
如仅仅是写作业的话(之前见过类似的),考虑查询速度建议直接自定义格式文件,使用索引+文件偏移的方式会比全部加载一个一个查快很多。学过数据库的话,可以搞一个,这个是现成的解决方案。

寂静的羽夏 | 园豆:1781 (小虾三级) | 2022-01-18 12:16

好的,谢谢了

支持(0) 反对(0) yunye2046 | 园豆:202 (菜鸟二级) | 2022-01-18 12:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册