添加后查找不到文件内容
显示记录是乱码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h> //控制台头文件 包含getch
struct student
{
char no[20];
char name[50];
int score[10];
char sex[10];
char year[10];
int month[20];
int day[20];
char tel[15];
};
char filename[100] = "studd.txt"; //设置文件名
FILE* fp;
void append(); //添加函数声明
void search(); //查找函数声明
void del(); //删除函数声明
void modify(); //修改函数声明
void output(); //显示函数声明
int main(void) //无类型
{
int num;
while (1)
{
printf(" ***学生成绩系统***\n ");
printf(" 1.添加记录\n");
printf(" 2.查找记录\n");
printf(" 3.修改记录\n");
printf(" 4.删除记录\n");
printf(" 5.显示记录\n");
printf(" 0.退出系统\n");
printf(" 选择序号0-5:");
scanf("%d", &num);
if (num >= 0 && num <= 5)
{
switch (num)
{
case 1:append(); break;
case 2:search(); break;
case 3:modify(); break;
case 4:del(); break;
case 5:output(); break;
case 0:
exit(1);
}
printf(" 操作完毕,请再次选择!\n");
}
else
printf(" 选择错误,请再次选择!\n");
}
getch(); //数据自动读取
return 0; //函数的返回值
}
//创建记录
//添加记录
void append()
{
struct student stu;
if ((fp = fopen(filename, "w")) == NULL) //追加
{
printf(" Cannot Open File!");
exit(0);
}
printf("请输入学号\n");
scanf("%s",stu.no);
printf("请输入姓名\n");
scanf("%s",stu.name);
printf("请输入成绩\n");
scanf("%d",stu.score);
printf("请输入性别\n");
scanf("%s",stu.sex);
printf("请输入年\n");
scanf("%s",stu.year);
printf("请输入月\n");
scanf("%d",stu.month);
printf("请输入日\n");
scanf("%d",stu.day);
printf("请输入电话\n");
scanf("%s",stu.tel);
fprintf(fp, "%s%s%d%s%s%d%d%s\n", stu.no, stu.name, stu.score,stu.sex,stu.year,stu.year,stu.month,stu.day,stu.tel);
fclose(fp);
return 0;
}
//查找记录
void search()
{
int k = 0;
char nokey[12];
struct student stu;
printf(" 请输入学号:\n");
scanf("%s", nokey);
if ((fp = fopen(filename, "r")) == NULL) //读
{
printf(" Cannot Open File!\n");
exit(0);
}
fseek(fp, 1L * sizeof(struct student), 0); //将文件指针移动
while (!feof(fp)) //检查文件是否结束
{
fscanf(fp, "%s%s%d%s%s%d%d%s", stu.no, stu.name, stu.score,stu.sex,stu.year,stu.month,stu.day,stu.day);
if (strcmp(nokey, stu.no) == 0) //字符串比较
{
printf(" 已查找到,该记录为:\n ");
scanf("%s%s%d%s%s%d%d%s\n", stu.no, stu.name, stu.score,stu.sex,stu.year,stu.month,stu.day,stu.tel);
k = 1;
break;
}
}
if (!k)
printf(" 文件中无此人的记录。\n");
fclose(fp);
}
//修改记录
void modify()
{
int k = 0;
long position;
char nokey[10];
struct student stu;
printf(" 请输入学号:");
scanf("%s", nokey);
if ((fp = fopen(filename, "r+")) == NULL)
{
printf(" Cannot Open File!\n");
exit(0);
}
fseek(fp, 1L * sizeof(struct student), 0);
while (!feof(fp))
{
fscanf(fp, "%s%s%d%s%s%d%d%s", stu.no, stu.name, &stu.score,stu.sex,stu.year,stu.month,stu.day,stu.tel);
if (strcmp(nokey, stu.no) == 0)
{
position = ftell(fp);
k = 1;
break;
}
}
if (k)
{
printf(" 已查找到,该记录为: ");
printf("%s%s%d%s%s%d%d%s\n", stu.no, stu.name, stu.score,stu.sex,stu.year,stu.month,stu.day,stu.tel);
printf(" 请输入新的学号、姓名及成绩:");
scanf("%s%s%d%s%s%s%d%s", stu.no, stu.name, &stu.score,stu.sex,stu.year,stu.month,stu.day,stu.tel);
fseek(fp, position - 1L * sizeof(struct student), SEEK_SET);
fprintf(fp, " %s%s%d%s%s%d%d%s", stu.no, stu.name, stu.score,stu.sex,stu.year,stu.month,stu.day,stu.tel);
}
else
printf(" 文件中无此人的记录。\n");
fclose(fp);
}
//删除记录
void del()
{
int m, k = 0;
long position;
char nokey[10];
struct student stu;
printf(" 请输入学号:");
scanf("%s", nokey);
if ((fp = fopen(filename, "r+")) == NULL)
{
printf(" Cannot Open File!\n");
exit(0);
}
fseek(fp, 1L * sizeof(struct student), 0);
while (!feof(fp))
{
fscanf(fp, "%s%s%d%s%s%d%d%s", stu.no, stu.name, &stu.score,stu.sex,stu.year,stu.month,stu.day,stu.tel);
if (strcmp(nokey, stu.no) == 0)
{
position = ftell(fp); //fp文件当前读写位置
k = 1;
break;
}
}
if (k)
{
printf(" 已查找到,该记录为: \n");
printf("%s%s%d%s%s%d%d%s\n", stu.no, stu.name, stu.score,stu.sex,stu.year,stu.month,stu.day,stu.tel);
printf(" 确实要删除记录,请按1;不删除记录,请按0:");
scanf("%d", &m);
if (m)
{
fseek(fp, position - 1L * sizeof(struct student), SEEK_SET);
fprintf(fp, "%s%s%d%s%s%d%d%s", "", "", "");
}
}
else
printf(" 文件中无此人的记录。\n");
fclose(fp);
}
//显示记录
void output()
{
struct student stu;
if ((fp = fopen(filename, "r")) == NULL)
{
printf(" Cannot Open File!");
exit(0);
}
printf(" 文件内容为: \n");
fseek(fp, 1L * sizeof(struct student), 0);
while (!feof(fp))
{
fscanf(fp, "%s%s%d%s%s%d%d%s ", stu.no, stu.name, stu.score,stu.sex,stu.year,stu.month,stu.day,stu.tel);
printf("%s%s%d%s%s%d%d%s\n", stu.no, stu.name, stu.score,stu.sex,stu.year,stu.month,stu.day,stu.tel);
}
fclose(fp);
}
修改如下,供参考:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h> //控制台头文件 包含getch
struct student
{
char no[20];
char name[50];
int score; //[10]; 修改
char sex[10];
char year[10];
int month; //[20]; 修改
int day; //[20]; 修改
char tel[15];
};
char filename[100] = "studd.txt"; //设置文件名
FILE* fp;
void append(); //添加函数声明
void search(); //查找函数声明
void del(); //删除函数声明
void modify(); //修改函数声明
void output(); //显示函数声明
int main(void) //无类型
{
int num;
while (1)
{
printf(" ***学生成绩系统***\n ");
printf(" 1.添加记录\n");
printf(" 2.查找记录\n");
printf(" 3.修改记录\n");
printf(" 4.删除记录\n");
printf(" 5.显示记录\n");
printf(" 0.退出系统\n");
printf(" 选择序号0-5:");
scanf("%d", &num);
if (num >= 0 && num <= 5)
{
switch (num)
{
case 1:append(); break;
case 2:search(); break;
case 3:modify(); break;
case 4:del(); break;
case 5:output(); break;
case 0:
exit(1);
}
printf(" 操作完毕,请再次选择!\n");
}
else
printf(" 选择错误,请再次选择!\n");
}
getch(); //数据自动读取
return 0; //函数的返回值
}
//创建记录
//添加记录
void append()
{
struct student stu;
if ((fp = fopen(filename, "a")) == NULL) //修改
//if ((fp = fopen(filename, "w"))
{
printf(" Cannot Open File!");
exit(0);
}
printf("请输入学号\n");
scanf("%s", stu.no);
printf("请输入姓名\n");
scanf("%s", stu.name);
printf("请输入成绩\n");
scanf("%d", &stu.score); //scanf("%d", stu.score);修改
printf("请输入性别\n");
scanf("%s", stu.sex);
printf("请输入年\n");
scanf("%s", stu.year);
printf("请输入月\n");
scanf("%d", &stu.month);//scanf("%d", stu.month);修改
printf("请输入日\n");
scanf("%d", &stu.day); //scanf("%d", stu.day); 修改
printf("请输入电话\n");
scanf("%s", stu.tel);
fprintf(fp, "%s %s %d %s %s %d %d %s\n", stu.no, stu.name, stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel); // 修改
//fprintf(fp, "%s%s%d%s%s%d%d%s\n", stu.no, stu.name, stu.score, stu.sex, stu.year, stu.year, stu.month, stu.day, stu.tel);
fclose(fp);
return; //0;
}
//查找记录
void search()
{
int k = 0;
char nokey[12];
struct student stu;
printf(" 请输入学号:\n");
scanf("%s", nokey);
if ((fp = fopen(filename, "r")) == NULL) //读
{
printf(" Cannot Open File!\n");
exit(0);
}
//fseek(fp, 1L * sizeof(struct student), 0); //将文件指针移动
while (!feof(fp)) //检查文件是否结束
{
fscanf(fp, "%s %s %d %s %s %d %d %s\n", stu.no, stu.name, &stu.score, stu.sex, stu.year, &stu.month, &stu.day, stu.tel); //修改
//fscanf(fp, "%s%s%d%s%s%d%d%s", stu.no, stu.name, &stu.score, stu.sex, stu.year, stu.month, &stu.day, stu.day);
if (strcmp(nokey, stu.no) == 0) //字符串比较
{
printf(" 已查找到,该记录为:\n ");
printf("%s %s %d %s %s %d %d %s\n", stu.no, stu.name, stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel); //修改
//scanf("%s%s%d%s%s%d%d%s\n", stu.no, stu.name, stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel);
k = 1;
break;
}
}
if (!k)
printf(" 文件中无此人的记录。\n");
fclose(fp);
}
//修改记录
void modify()
{
int k = 0;
long position;
char nokey[10];
struct student stu;
printf(" 请输入学号:");
scanf("%s", nokey);
if ((fp = fopen(filename, "r+")) == NULL)
{
printf(" Cannot Open File!\n");
exit(0);
}
//fseek(fp, 1L * sizeof(struct student), 0);
while (!feof(fp))
{
fscanf(fp, "%s %s %d %s %s %d %d %s\n", stu.no, stu.name, &stu.score, stu.sex, stu.year, &stu.month, &stu.day, stu.tel); //修改
//fscanf(fp, "%s%s%d%s%s%d%d%s", stu.no, stu.name, &stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel);
if (strcmp(nokey, stu.no) == 0)
{
position = ftell(fp);
k = 1;
break;
}
}
if (k)
{
printf(" 已查找到,该记录为: ");
printf("%s %s %d %s %s %d %d %s\n", stu.no, stu.name, stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel); //修改
//printf("%s%s%d%s%s%d%d%s\n", stu.no, stu.name, stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel);
printf(" 请输入新的学号、姓名及成绩:");
scanf("%s %s %d %s %s %d %d %s", stu.no, stu.name, &stu.score, stu.sex, stu.year, &stu.month, &stu.day, stu.tel); //修改
//scanf("%s%s%d%s%s%s%d%s", stu.no, stu.name, &stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel);
fseek(fp, position - 1L * sizeof(struct student), SEEK_SET);
fprintf(fp, "%s %s %d %s %s %d %d %s", stu.no, stu.name, stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel);//修改
//fprintf(fp, " %s%s%d%s%s%d%d%s", stu.no, stu.name, stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel);
}
else
printf(" 文件中无此人的记录。\n");
fclose(fp);
}
//删除记录
void del()
{
int m, k = 0;
long position;
char nokey[10];
struct student stu;
printf(" 请输入学号:");
scanf("%s", nokey);
if ((fp = fopen(filename, "r+")) == NULL)
{
printf(" Cannot Open File!\n");
exit(0);
}
//fseek(fp, 1L * sizeof(struct student), 0);
while (!feof(fp))
{
fscanf(fp, "%s %s %d %s %s %d %d %s\n", stu.no, stu.name, &stu.score, stu.sex, stu.year, &stu.month, &stu.day, stu.tel);//修改
//fscanf(fp, "%s%s%d%s%s%d%d%s", stu.no, stu.name, &stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel);
if (strcmp(nokey, stu.no) == 0)
{
position = ftell(fp); //fp文件当前读写位置
k = 1;
break;
}
}
if (k)
{
printf(" 已查找到,该记录为: \n");
printf("%s %s %d %s %s %d %d %s\n", stu.no, stu.name, stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel);
printf(" 确实要删除记录,请按1;不删除记录,请按0:");
scanf("%d", &m);
if (m)
{
fseek(fp, position - 1L * sizeof(struct student), SEEK_SET);
fprintf(fp, "%s %s %d %s %s %d %d %s", "", "", "","","","","",""); //修改
}
}
else
printf(" 文件中无此人的记录。\n");
fclose(fp);
}
//显示记录
void output()
{
struct student stu;
if ((fp = fopen(filename, "r")) == NULL)
{
printf(" Cannot Open File!");
exit(0);
}
printf(" 文件内容为: \n");
//fseek(fp, 1L * sizeof(struct student), 0);
while (1) //while (!feof(fp))
{
if (fscanf(fp, "%s %s %d %s %s %d %d %s\n", stu.no, stu.name, &stu.score, stu.sex, stu.year, &stu.month, &stu.day, stu.tel) == 8)//修改
//fscanf(fp, "%s%s%d%s%s%d%d%s ", stu.no, stu.name, stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel);
printf("%s %s %d %s %s %d %d %s\n", stu.no, stu.name, stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel);//修改
//printf("%s%s%d%s%s%d%d%s\n", stu.no, stu.name, stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel);
else
break;
}
fclose(fp);
}
结构体中,int score[10];改为int socre;你定义数组干啥呢?
int month[20];
int day[20]; 定义20是要干啥,为什么年是char类型,而月日是int???int就不要用数组
#include<stdio.h>
int main(void)
{
int a,b;
scanf("%d %d",&a,&b);
printf("%d",a+b);
return 0;
}
根据提供的参考代码和问题描述,存在两个问题需要解决:
根据提供的参考代码和问题描述,可以确定问题出在添加学生信息后无法正确查找到文件内容的地方。以下是解决该问题的步骤和代码示例:
input
。input
中,修改文件打开的模式为追加模式,即将 "wb"
修改为 "ab"
,以便在已有文件内容的基础上添加新的学生信息。fwrite
函数的参数,将 sizeof(s[i])
修改为 sizeof(struct student)
。修改后的代码如下:
void input(struct student s[], int n) {
int i, j;
FILE* fp;
double ave = 0;
fp = fopen("d:\\lcy\\bigdata.txt", "ab");
fseek(fp, 0, SEEK_END);
for (i = 0; i < 3; i++) {
gets(s[i].XH);
gets(s[i].name);
for (j = 0; j < 3; j++) {
scanf("%lf", &s[i].score[j]);
s[i].ave += s[i].score[j];
}
s[i].ave /= 3;
fwrite(&s[i], sizeof(struct student), 1, fp);
getchar();
}
fclose(fp);
}
根据提供的参考代码和问题描述,可以确定问题出在查询学生信息时,显示的记录是乱码的地方。以下是解决该问题的步骤和代码示例:
output
。output
中,修改文件打开的模式为读取模式,即将 "rb"
修改为 "r"
。fread
函数的参数,将 sizeof(s[i])
修改为 sizeof(struct student)
。\n
结尾。修改后的代码如下:
void output(struct student s[], int n) {
FILE* fp;
int i, j;
fp = fopen("d:\\lcy\\stud_sort.txt", "r");
for (i = 0; i < 3; i++) {
fread(&s[i], sizeof(struct student), 1, fp);
puts(s[i].XH);
puts(s[i].name);
for (j = 0; j < 3; j++)
printf("%lf\t", s[i].score[j]);
printf("\n");
}
fclose(fp);
}
请执行以上步骤来解决该问题。
如果还有其他问题,请详细描述,以便我提供进一步的帮助。