一袭白衣梅子酒 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日

悬赏问题

  • ¥15 C#读写EXCEL文件,不同编译
  • ¥15 如何提取csv文件中需要的列,将其整合为一篇完整文档,并进行jieba分词(语言-python)
  • ¥15 MapReduce结果输出到HBase,一直连接不上MySQL
  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键
  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符
  • ¥15 NX MCD仿真与博途通讯不了啥情况
  • ¥15 win11家庭中文版安装docker遇到Hyper-V启用失败解决办法整理
  • ¥15 gradio的web端页面格式不对的问题
  • ¥15 求大家看看Nonce如何配置