一袭白衣梅子酒 2019-12-22 21:00 采纳率: 100%
浏览 332
已采纳

救救孩子吧!如何解决读取txt文件出现索引超出了数组的范围的问题

#include
#include
void main()
{
typedef struct LNode
{
char name[6];
int no;
int yw;
int sx;
int yy;
struct LNode* next;
}LinkList;
struct NameNo
{
int no;
int yw;
int sx;
int total;
char name[6];
}st[10];
FILE* fp, * fp1;
char ch, sname[6];
int x, i, j;
NameNo tmp;
LinkList* p, * s;
printf("\n");
printf("-------------------------------");
printf("学生成绩管理系统");
printf("--------------------------------");
printf("\n\n");
printf("在您的C盘根目录下是否有cj1.txt和cj2.txt文件?如果有请输入1,");
printf("否则输入0;如果没有,那么程序将终止!1 or 0?");
scanf("%d", &i);
if (i == 0) return;
printf("\n\n");
printf("对cj1.txt和cj2.txt进行合成请按''");
scanf("%d", &i);
if (i != 1) return;
printf("正在把cj1.txt和cj2.txt中的数据进行合并\n");
printf("......\n.....\n....\n...\n..\n.\n");
if ((fp = fopen("c:\cj1.txt", "rt")) == NULL) //从文本文件cj1.txt中读取数据传向cj3.txt
{
printf("无cj1.txt文本文件,程序结束。\n");
return;
}
fp1 = fopen("c:\cj3.txt", "wt");
ch = fgetc(fp);
while (ch != EOF)
{
fputc(ch, fp1);
ch = fgetc(fp);
}
fclose(fp1);
fclose(fp);
if ((fp = fopen("c:\cj2.txt", "rt")) == NULL) //从文本文件cj2.txt中读取数据接到cj3.txt的后面
{
printf("无cj12.txt文本文件,程序结束。\n");
return;
}
fp1 = fopen("c:\cj3.txt", "a");
for (i = 0; i < 37; i++)
fgetc(fp);
ch = fgetc(fp);
while (ch != EOF)
{
fputc(ch, fp1);
ch = fgetc(fp);
}
fclose(fp1);
fclose(fp);
printf("合并成功!现在你可以在C盘根目录下看到一个cj3.txt文件\n");
printf("\n\n");
p = (LinkList*)malloc(sizeof(LinkList));
p->next = NULL;
fp = fopen("c:\cj3.txt", "rt");//从合成后的cj3.txt读取数据,生成链表
for (i = 0; i < 36; i++)
fgetc(fp);
ch = fgetc(fp);
while (ch != EOF)
{
s = (LinkList*)malloc(sizeof(LinkList));
fgets(s->name, 6, fp);
for (i = 0; i < 5; i++)
fgetc(fp);
x = fgetc(fp) - 48;
x = x * 10 + fgetc(fp) - 48;
s->no = x;
for (i = 0; i < 5; i++)
fgetc(fp);
x = fgetc(fp) - 48;
x = x * 10 + fgetc(fp) - 48;
s->yw = x;
for (i = 0; i < 5; i++)
fgetc(fp);
x = fgetc(fp) - 48;
x = x * 10 + fgetc(fp) - 48;
s->sx = x;
for (i = 0; i < 5; i++)
fgetc(fp);
x = fgetc(fp) - 48;
x = x * 10 + fgetc(fp) - 48;
s->yy = x;
s->next = p->next;
p->next = s;
ch = fgetc(fp);
}
fclose(fp);
printf("对cj3.txt中有不及格的学生信息生成cj4.txt请按''");
scanf("%d", &i);
if (i != 1) return;
printf("正在生成cj4.txt\n");
printf("......\n.....\n....\n...\n..\n.\n");
if (i == 1)
fp = fopen("c:\cj4.txt", "wt");//把三科成绩中有补考的学生信息放入cj4.txt
fputs("姓 名 学号 语文 数学 英语", fp);
fclose(fp);
fp = fopen("c:\cj4.txt", "a");
s = p->next;
while (s != NULL)
{
if (s->yw < 60 || s->sx < 60 || s->yy < 60)
{
ch = '\n';
fputc(ch, fp);
fputs(s->name, fp);
for (i = 0; i < 5; i++)
{
ch = ' ';
fputc(ch, fp);
}
ch = s->no / 10 + 48;
fputc(ch, fp);
ch = s->no - (s->no / 10) * 10 + 48;
fputc(ch, fp);
for (i = 0; i < 5; i++)
{
ch = ' ';
fputc(ch, fp);
}
ch = s->yw / 10 + 48;
fputc(ch, fp);
ch = s->yw - (s->yw / 10) * 10 + 48;
fputc(ch, fp);
for (i = 0; i < 5; i++)
{
ch = ' ';
fputc(ch, fp);
}
ch = s->sx / 10 + 48;
fputc(ch, fp);
ch = s->sx - (s->sx / 10) * 10 + 48;
fputc(ch, fp);
for (i = 0; i < 5; i++)
{
ch = ' ';
fputc(ch, fp);
}
ch = s->yy / 10 + 48;
fputc(ch, fp);
ch = s->yy - (s->yy / 10) * 10 + 48;
fputc(ch, fp);
s = s->next;
}
else
s = s->next;
}
fclose(fp);
printf("生成成功!现在你可以在C盘根目录下看到一个cj4.txt文件");
printf("\n\n");
s = p->next;//将学生信息从链表复制到数组中
for (i = 0; i < 10; i++)
{
st[i].no = s->no;
st[i].yw = s->yw;
st[i].sx = s->sx;
st[i].total = s->yw + s->sx + s->yy;
for (j = 0; j < 7; j++)
st[i].name[j] = s->name[j];
s = s->next;
}
printf("用直接插入法排序请按'':");
scanf("%d", &i);
printf("\n\n");
if (i == 1)
{
for (i = 1; i < 10; i++)//直接插入法排序
{
tmp = st[i];
j = i - 1;
while (j >= 0 && tmp.total > st[j].total)
{
st[j + 1] = st[j];
j--;
}
st[j + 1] = tmp;
}
printf(" 直接插入法排序后总分从大到小排序为\n");
printf("\n\n");
printf("姓 名 学号 语文 数学 英语 总分\n");
for (i = 0; i < 10; i++)
{
if (st[i].no < 10)
{
printf("%s ", st[i].name);
printf("%d", 0);
printf("%d ", st[i].no);
printf("%d ", st[i].yw);
printf("%d ", st[i].sx);
printf("%d ", st[i].total - st[i].yw - st[i].sx);
printf("%d\n", st[i].total);
printf("\n");
}
else
{
printf("%s ", st[i].name);
printf("%d ", st[i].no);
printf("%d ", st[i].yw);
printf("%d ", st[i].sx);
printf("%d ", st[i].total - st[i].yw - st[i].sx);
printf("%d\n", st[i].total);
printf("\n");
}
}
}
printf("将排好序的数组打乱\n");
printf("\n");
s = p->next;//将排好序的数组打乱,从新用冒泡法排序
for (i = 0; i < 10; i++)
{
st[i].no = s->no;
st[i].yw = s->yw;
st[i].sx = s->sx;
st[i].total = s->yw + s->sx + s->yy;
for (j = 0; j < 7; j++)
st[i].name[j] = s->name[j];
s = s->next;
}
printf("用冒泡法排序请按'':");
scanf("%d", &i);
printf("\n\n");
if (i == 1)
{
for (i = 0; i < 9; i++)//冒泡法排序
{
for (j = 9; j > i; j--)
if (st[j].total > st[j - 1].total)
{
tmp = st[j];
st[j] = st[j - 1];
st[j - 1] = tmp;
}
}
printf(" 冒泡法排序后总分从大到小排序为\n");
printf("\n\n");
printf("姓 名 学号 语文 数学 英语 总分\n");
for (i = 0; i < 10; i++)
{
if (st[i].no < 10)
{
printf("%s ", st[i].name);
printf("%d", 0);
printf("%d ", st[i].no);
printf("%d ", st[i].yw);
printf("%d ", st[i].sx);
printf("%d ", st[i].total - st[i].yw - st[i].sx);
printf("%d\n", st[i].total);
printf("\n");
}
else
{
printf("%s ", st[i].name);
printf("%d ", st[i].no);
printf("%d ", st[i].yw);
printf("%d ", st[i].sx);
printf("%d ", st[i].total - st[i].yw - st[i].sx);
printf("%d\n", st[i].total);
printf("\n");
}
}
}
printf("\n");
printf("请输入你要查找的学生姓名:(注意:如果名字为两个字,则中间用两个空格!)\n");
do {
x = 1;
if (i == 1)
printf("输入姓名:");
getchar();
for (i = 0; i < 7; i++)
sname[i] = getchar();
for (i = 0; i < 10; i++)//在数组中顺序查找
{
for (j = 0; st[i].name[j] == sname[j]; j++) {}
if (j == 6)
{
printf(" 数组中查找结果");
printf("\n\n");
printf("姓 名 学号 语文 数学 英语 总分\n");
printf("%s", st[i].name);
printf(" %d", st[i].no);
printf(" %d", st[i].yw);
printf(" %d", st[i].sx);
printf(" %d", st[i].total - st[i].yw - st[i].sx);
printf(" %d\n\n", st[i].total);
x = 0;
}
}
if (x != 0)
printf(" 查无此人!\n");
s = p->next;
while (s != NULL)//在链表中顺序查找
{
for (i = 0; s->name[i] == sname[i]; i++) {}
if (i == 6)
{
printf(" 链表中查找结果");
printf("\n\n");
printf("姓 名 学号 语文 数学 英语 总分\n");
printf("%s", s->name);
printf(" %d", s->no);
printf(" %d", s->yw);
printf(" %d", s->sx);
printf(" %d", s->yy);
printf(" %d\n\n", s->yw + s->sx + s->yy);
x = 0;
}
s = s->next;
}
if (x != 0)
printf(" 查无此人!\n");
i = 0;
printf("继续查找请按''");
scanf("%d", &i);
} while (i == 1);
printf("\n\n");
printf("-----------------------------谢谢使用!--------------------------------\n\n");
}
请问如何解决索引超出了数组的范围这一问题
现有学生成绩信息文件1(1.txt),内容如下
姓名 学号 语文 数学 英语

张明明 01 67 78 82
李成友 02 78 91 88
张辉灿 03 68 82 56
王露 04 56 45 77
陈东明 05 67 38 47
学生成绩信息文件2(2.txt),内容如下:
姓名 学号 语文 数学 英语

陈果 31 57 68 82
李华明 32 88 90 68
张明东 33 48 42 56
李明国 34 50 45 87
陈道亮 35 47 58 77
…. .. .. .. …

图片说明

  • 写回答

1条回答

  • 关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 1月2日

悬赏问题

  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程