新人发帖,自各儿编写的同学信息管理程序,读取信息与查找的时候一直出错
新人发帖,自己编写的同学信息管理程序,读取信息与查找的时候一直出错。
/*
学生信息管理系统
作者:yy57
时间:2014.04.13——
*/
#include<stdio.h>
#include<windows.h>
#define NUM 200
char sstu[15];
struct student //定义结构体,用来储存学生资料
{
char name[12];
char StuNum[15];
char PhoneNum[15];
}stu[NUM];
void input(); //学生信息输入函数
void output(); //学生信息输出函数
void seek(); //学生信息查找函数
int main() //主函数,控制整个过程
{
int i = 10;
printf("欢迎使用本系统。请输入相应的序号进行操作。\n");
printf("1、输入学生资料\n");
printf("2、输出学生所有资料\n");
printf("3、查找学生资料\n");
printf("0、退出\n");
while (i)
{
scanf_s("%d",&i);
switch (i)
{
case 1:input(); break;
case 2:output(); break;
case 3:seek(); break;
case 0:break;
default:printf("输入有误,请重新输入\n");
break;
}
}
system("pause");
return 0;
}
void input() //输入函数的定义
{
FILE *fp;
int i=0,j=0;
errno_t err = fopen_s(&fp, "D:\\data.txt", "wb"); //大量的信息传递,选择二进制写入。
if (err != 0) //判断是否成功打开文件。
{
printf("无法打开文件。\n");
exit(0);
}
fseek(fp, 0L, SEEK_END); //每次写入的资料都在文件的末尾。
printf("请输入本次写入的学生数据个数:\n");
scanf_s("%d",&i);
getchar();
printf("请输入姓名,学号,电话:\n");
for (j=0; j < i; j++)
{
scanf_s("%s %s %s", stu[i].name, 12, stu[i].StuNum, 15, stu[i].PhoneNum, 15);
}
for (j=0; j < i; j++)
{
if (fwrite(&stu[j], sizeof(struct student), 1, fp) != 1)
printf("写入失败。\n");
}
fclose(fp);
return;
}
void output() //输出函数的定义
{
FILE *fp;
int i = 0,flen;
errno_t err = fopen_s(&fp, "D:\\data.txt", "rb"); //大量的信息传递,选择二进制读取。
if (err != 0)
{
printf("无法打开文件。\n");
exit(0);
}
fseek(fp, 0L, SEEK_END); //确定当前文件长度
flen = ftell(fp);
flen = flen / sizeof(struct student);
fseek(fp, 0L, SEEK_SET);
for (i = 0; i < flen; i++)
{
if (fread(&stu[i], sizeof(struct student), 1, fp) != 1)
printf("读取失败。\n");
}
for (i = 0; i < flen; i++)
{
printf("%s %s %s", stu[i].name, stu[i].StuNum, stu[i].PhoneNum);
}
fclose(fp);
return;
}
void seek() //学生信息查找函数
{
FILE *fp;
int i = 0,flen;
errno_t err = fopen_s(&fp, "D:\\data.txt", "rb"); //大量的信息传递,选择二进制读取。
if (err != 0)
{
printf("无法打开文件。\n");
exit(0);
}
fseek(fp, 0L, SEEK_END); //确定当前的文件长度。
flen = ftell(fp);
flen = flen / sizeof(struct student);
fseek(fp, 0L, SEEK_SET);
for (i = 0; i < flen; i++)
{
if (fread(&stu[i], sizeof(struct student), 1, fp) != 1)
printf("读取失败。\n");
}
printf("请输入要查找人的姓名、学号或者电话号码:\n");
scanf_s("%s",sstu,15);
getchar();
for (i = 0; i < flen; i++)
{
if (strcmp(sstu, stu[i].name) == 0 || strcmp(sstu, stu[i].StuNum) == 0 || strcmp(sstu, stu[i].PhoneNum) == 0)
{
printf("%s %s %s", stu[i].name, stu[i].StuNum, stu[i].PhoneNum);
return;
}
}
printf("未查找到此人信息。");
return;
}
运行结果截图。


------解决方案--------------------
这个要一步步调试,先确保输入的信息保存好了,然后查找的数据地址是对的。
------解决方案--------------------
可能是字节对齐的问题。可以参考这个看看http://blog.****.net/chenglibin1988/article/details/8882852
------解决方案--------------------
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
------解决方案--------------------
我也是新手,最近刚好也编过学生信息管理程序,方式有点不一样。胡乱说点意见,不知道是不是你在保存信息的时候,(因为你用的是字符串形式输入的),系统后面自动加了‘\0’的缘故。所以你在查找的时候就对不上了。(我也没试过,不知道是不是这个原因)
/*
学生信息管理系统
作者:yy57
时间:2014.04.13——
*/
#include<stdio.h>
#include<windows.h>
#define NUM 200
char sstu[15];
struct student //定义结构体,用来储存学生资料
{
char name[12];
char StuNum[15];
char PhoneNum[15];
}stu[NUM];
void input(); //学生信息输入函数
void output(); //学生信息输出函数
void seek(); //学生信息查找函数
int main() //主函数,控制整个过程
{
int i = 10;
printf("欢迎使用本系统。请输入相应的序号进行操作。\n");
printf("1、输入学生资料\n");
printf("2、输出学生所有资料\n");
printf("3、查找学生资料\n");
printf("0、退出\n");
while (i)
{
scanf_s("%d",&i);
switch (i)
{
case 1:input(); break;
case 2:output(); break;
case 3:seek(); break;
case 0:break;
default:printf("输入有误,请重新输入\n");
break;
}
}
system("pause");
return 0;
}
void input() //输入函数的定义
{
FILE *fp;
int i=0,j=0;
errno_t err = fopen_s(&fp, "D:\\data.txt", "wb"); //大量的信息传递,选择二进制写入。
if (err != 0) //判断是否成功打开文件。
{
printf("无法打开文件。\n");
exit(0);
}
fseek(fp, 0L, SEEK_END); //每次写入的资料都在文件的末尾。
printf("请输入本次写入的学生数据个数:\n");
scanf_s("%d",&i);
getchar();
printf("请输入姓名,学号,电话:\n");
for (j=0; j < i; j++)
{
scanf_s("%s %s %s", stu[i].name, 12, stu[i].StuNum, 15, stu[i].PhoneNum, 15);
}
for (j=0; j < i; j++)
{
if (fwrite(&stu[j], sizeof(struct student), 1, fp) != 1)
printf("写入失败。\n");
}
fclose(fp);
return;
}
void output() //输出函数的定义
{
FILE *fp;
int i = 0,flen;
errno_t err = fopen_s(&fp, "D:\\data.txt", "rb"); //大量的信息传递,选择二进制读取。
if (err != 0)
{
printf("无法打开文件。\n");
exit(0);
}
fseek(fp, 0L, SEEK_END); //确定当前文件长度
flen = ftell(fp);
flen = flen / sizeof(struct student);
fseek(fp, 0L, SEEK_SET);
for (i = 0; i < flen; i++)
{
if (fread(&stu[i], sizeof(struct student), 1, fp) != 1)
printf("读取失败。\n");
}
for (i = 0; i < flen; i++)
{
printf("%s %s %s", stu[i].name, stu[i].StuNum, stu[i].PhoneNum);
}
fclose(fp);
return;
}
void seek() //学生信息查找函数
{
FILE *fp;
int i = 0,flen;
errno_t err = fopen_s(&fp, "D:\\data.txt", "rb"); //大量的信息传递,选择二进制读取。
if (err != 0)
{
printf("无法打开文件。\n");
exit(0);
}
fseek(fp, 0L, SEEK_END); //确定当前的文件长度。
flen = ftell(fp);
flen = flen / sizeof(struct student);
fseek(fp, 0L, SEEK_SET);
for (i = 0; i < flen; i++)
{
if (fread(&stu[i], sizeof(struct student), 1, fp) != 1)
printf("读取失败。\n");
}
printf("请输入要查找人的姓名、学号或者电话号码:\n");
scanf_s("%s",sstu,15);
getchar();
for (i = 0; i < flen; i++)
{
if (strcmp(sstu, stu[i].name) == 0 || strcmp(sstu, stu[i].StuNum) == 0 || strcmp(sstu, stu[i].PhoneNum) == 0)
{
printf("%s %s %s", stu[i].name, stu[i].StuNum, stu[i].PhoneNum);
return;
}
}
printf("未查找到此人信息。");
return;
}
运行结果截图。
------解决方案--------------------
这个要一步步调试,先确保输入的信息保存好了,然后查找的数据地址是对的。
------解决方案--------------------
可能是字节对齐的问题。可以参考这个看看http://blog.****.net/chenglibin1988/article/details/8882852
------解决方案--------------------
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
------解决方案--------------------
我也是新手,最近刚好也编过学生信息管理程序,方式有点不一样。胡乱说点意见,不知道是不是你在保存信息的时候,(因为你用的是字符串形式输入的),系统后面自动加了‘\0’的缘故。所以你在查找的时候就对不上了。(我也没试过,不知道是不是这个原因)