user-0 提问: 我又来问代码问题啦

回复:
user: user-0
content: 没人回了咩

user: user-0
content: 引用 15 楼 zhao4zhong1 的回复:仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %32[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8   现在是执行类似“f=fopen("data.txt","r");”语句是就会出错，像16楼图中显示的那样

user: user-0

user: user-1
content: 仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %32[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8

user: user-2
content: 引用 11 楼 baidu_27937801 的回复:那要怎么解决呢？刚学到文件操作不是很懂！ fp_r的操作放在判断成功打开之后不就行了。反正你现在是打开出错，GetLastError看为什么吧。 http://baike.baidu.com/link?url=pDireFii3z21QJ8ih6qGjcu6HRYo9gDO87KT8dvjoyYVFF-ojlOyFPq9kAv-b6Od2sq7tYCz9slf1UqJ6K20EK  int iError = 0; fp_r = fopen("stu.txt", "r"); if ( fp_r== NULL)//文件读指针fp_r指向文件信息区,打开方式为读 { iError = GetLastError(); printf("文件打开失败！\n");//打开失败提示语 exit(0); } rewind(fp_r); //。。。。。。。。。

user: user-0
content: 引用 12 楼 bjym1987 的回复://又来问，又不注意代码格式

user: user-3
content: //又来问，又不注意代码格式

user: user-0
content: 引用 10 楼 tpnndhqc 的回复:[quote=引用 8 楼 baidu_27937801 的回复:] [quote=引用 6 楼 tpnndhqc 的回复:] [quote=引用 5 楼 baidu_27937801 的回复:] 在数据追加模块里，运行到  “head = read_file();” 这一行代码是显示无法读取内存. 你的这行read_file代码不是一个函数么，加个断点先进去看看具体哪一行报的“无法读取内存”错。 我怀疑是rewind(fp_r);错的，跟踪下吧。[/quote] 嗯!是的![/quote] 是就行了，给分！文件指针操作在判断成功之前就敢用，你也是虎啊。。。[/quote] 那要怎么解决呢？刚学到文件操作不是很懂！

user: user-2
content: 引用 8 楼 baidu_27937801 的回复:[quote=引用 6 楼 tpnndhqc 的回复:] [quote=引用 5 楼 baidu_27937801 的回复:] 在数据追加模块里，运行到  “head = read_file();” 这一行代码是显示无法读取内存. 你的这行read_file代码不是一个函数么，加个断点先进去看看具体哪一行报的“无法读取内存”错。 我怀疑是rewind(fp_r);错的，跟踪下吧。[/quote] 嗯!是的![/quote] 是就行了，给分！文件指针操作在判断成功之前就敢用，你也是虎啊。。。

user: user-2
content: 引用 7 楼 baidu_27937801 的回复:就是这个样子 。。。我了个蛋疼啊，你在read_file里面打断点啊，这断点设哪的能出这样谁能看出来。 最可能的地方就是 fp_r = fopen("stu.txt", "r");失败，然后用了rewind(fp_r);所以后面根本没执行就报内存错了。 重新编译在fopen前面打断点F10看。

user: user-0
content: 引用 6 楼 tpnndhqc 的回复:[quote=引用 5 楼 baidu_27937801 的回复:] 在数据追加模块里，运行到  “head = read_file();” 这一行代码是显示无法读取内存. 你的这行read_file代码不是一个函数么，加个断点先进去看看具体哪一行报的“无法读取内存”错。 我怀疑是rewind(fp_r);错的，跟踪下吧。[/quote] 嗯!是的!

user: user-0
content: 就是这个样子

user: user-2
content: 引用 5 楼 baidu_27937801 的回复:在数据追加模块里，运行到  “head = read_file();” 这一行代码是显示无法读取内存. 你的这行read_file代码不是一个函数么，加个断点先进去看看具体哪一行报的“无法读取内存”错。 我怀疑是rewind(fp_r);错的，跟踪下吧。

user: user-0
content: 引用 3 楼 u012578046 的回复:不知道，是不是文件输入格式有问题？检查一下 在数据追加模块里，运行到  “head = read_file();” 这一行代码是显示无法读取内存.

user: user-0
content: 引用 3 楼 u012578046 的回复:不知道，是不是文件输入格式有问题？检查一下  嗯好的!谢谢啦！

user: user-0
content: 我想还是贴出我完整的代码吧！@Sping    大神的方法我真的试过了，真的没有返回错误类型。 下面的代码是在vc++6.0里面调试的。我开始是在vs2013里调试的，后来换到vc++6.0，执行添加功能是还是运行到fp_r=fopen("stu.txt","a+")就运行不下去了。另外上面热心解答的大神们先谢过啦哈！  #include <stdio.h> #include <stdlib.h> #include <string.h> #define L sizeof(struct student) #define FORMAT_DATA "%-8d%-8s %-8.1f %-8.1f %-8.1f %-8.2f %-8.2f\n" #define FORMAT_HEAD "\n%-8s%-9s%-9s%-9s%-9s%-9s%-9s\n" struct student    //定义学生链表结点类型 { 	long ID;//学号 	char name[12];//姓名 	float eng;//英语成绩 	float math;//数学成绩 	float computer;//计算机成绩 	float ave;//平均成绩 	float sum;//总成绩 	struct student *next; }; int n;//学生人数 /***************************录入模块******************************/ struct student *create() { 	int i; 	struct student *head, *last, *p; 	printf("请输入学生人数：\n"); 	scanf("%d", &n); 	head = (struct student*)malloc(L);//创建头结点 	last = head;//末结点指针last初始化 	for (i = 0; i < n; i++) 	{ 		p = (struct student *)malloc(L);//创建新结点 		printf("请输入学生学号：\n"); 		scanf("%d", &p->ID); 		getchar(); 		printf("请输入学生姓名：\n"); 		gets(p->name); 		printf("请输入学生英语成绩：\n"); 		scanf("%f", &p->eng); 		printf("请输入学生数学成绩：\n"); 		scanf("%f", &p->math); 		printf("请输入学生计算机成绩：\n"); 		scanf("%f", &p->computer); 		p->sum = p->eng + p->math + p->computer; 		p->ave = p->sum / 3; 		last->next = p;//插入链尾 		last = last->next;//last指针后移至末结点 	} 	last->next = NULL;//链表终止延伸 	printf("**************************************输入完成***************************"); 	return head;//返回头指针 } /******************************************输出模块****************************************/ void print(struct student *head) { 	struct student *p; 	p = head->next;//指向头结点 	printf("\n所有学生信息如下：\n"); 	printf(FORMAT_HEAD,"学号", "姓名", "英语", "数学","计算机","平均成绩","总成绩"); 	while (p != NULL) 	{ 		printf(FORMAT_DATA, p->ID, p->name, p->eng, p->math, p->computer, p->ave, p->sum);//输出当前结点包含的信息 		p= p->next;//指向下一个结点	 	} 	printf("\n*******************************输出完成!**************************\n"); } /********************************************文件保存模块******************************************/ void save_file(struct student *head) { 	FILE *fp_s; 	struct student *p; 	system("cls"); 	if ((fp_s = fopen("stu.txt", "w")) == NULL)//文件读指针fp_s指向文件信息区,打开方式为写 	{ 		printf("文件打开失败！\n");//文件打开失败提示语 		exit(0); 	} 	p = head->next; 	while (p != NULL)//输出数据到文件 	{ 		fprintf(fp_s, FORMAT_DATA, p->ID, p->name, p->eng, p->math, p->computer, p->ave, p->sum); 		p = p->next; 	} 	fclose(fp_s); 	printf("\n******************************保存完毕****************************\n"); } /*******************************************文件读取模块************************************/ struct student *read_file() { 	 	FILE *fp_r; 	struct student *head_r, *last_r, *p; 	//fp_r = fopen("stu.txt","a+"); 	if ((fp_r=fopen("stu.txt", "a+")) == NULL) 	{ 		printf("文件打开失败！\n");//打开失败提示语 		exit(0); 	} 	head_r= (struct student*)malloc(L); 	last_r = head_r; 	while (!feof(fp_r))//读取文件并创建链表 	{ 		p = (struct student *)malloc(L); 		fscanf(fp_r,"%-8d%-8s %-8f %-8f %-8f %-8f %-8f\n", &p->ID, p->name, &p->eng, &p->math, &p->computer, &p->ave, &p->sum); 		last_r->next = p; 		last_r = last_r->next; 	} 	last_r->next = NULL; 	fclose(fp_r); 	return head_r; } /***********************数据查询模块****************************/ void search(struct student *head) { 	long ID_WANTED; 	struct student *pre,*p; 	pre = head; 	p = head->next; 	printf("请输入要查找的学号："); 	scanf("%ld", &ID_WANTED); 	while (p)  //循环寻找满足输入学号的结点，并输出结点信息 	{ 		while (ID_WANTED!= p->ID && p->next != NULL)//寻找匹配的节点 		{ 			pre = p; 			p = p->next; 		} 		if (p->ID ==ID_WANTED)//输出匹配结点的信息 		{ 			printf("\n所查找的学生信息为：\n"); 			printf(FORMAT_HEAD, "学号", "姓名", "英语", "数学", "计算机", "平均成绩", "总成绩"); 			printf(FORMAT_DATA, p->ID, p->name, p->eng, p->math, p->computer, p->ave, p->sum); 			p = p->next; 		} 		else 		{ 			printf("不存在学号为%ld的学生！\n",ID_WANTED); 			break; 		} 	} 	printf("\n查找完毕！\n"); } /*************************数据删除模块***************************/ struct student *del(struct student*head) { 	long ID_WANTED; 	struct student *pre,*p; 	pre = head; 	p = head->next; 	printf("请输入要查找的学号："); 	scanf("%ld", &ID_WANTED); 	while (ID_WANTED != p->ID && p->next != NULL)//寻找匹配的节点 	{ 			pre = p; 			p = p->next; 	} 	if (p->ID == ID_WANTED)//删除匹配结点 	{ 		printf("\n将要删除的学生信息为：\n"); 		printf(FORMAT_HEAD, "学号", "姓名", "英语", "数学", "计算机", "平均成绩", "总成绩"); 		printf(FORMAT_DATA, p->ID, p->name, p->eng, p->math, p->computer, p->ave, p->sum); 		pre->next = p->next; 		free(p); 	} 	else 	    printf("不存在学号为%ld的学生！\n", ID_WANTED); 	printf("\n删除完毕！\n"); 	return head; } /**********************数据追加模块****************************/ struct student *insert() { 	int n_i; 	struct student *p_in,*head,*p,*p1; 	printf("请输入添加的学生人数：\n"); 	scanf("%d",&n_i); 	head = read_file(); 	p = head; 	p1 = p; 	while (p != NULL);//定位到链尾 	{ 		p1 = p; 		p = p->next; 	} 	while (n_i != 0) 	{ 		p_in = (struct student*)malloc(L);//创建新节点 		printf("请输入学生学号：\n"); 		scanf("%d", &p_in->ID); 		getchar(); 		printf("请输入学生姓名：\n"); 		gets(p_in->name); 		printf("请输入学生英语成绩：\n"); 		scanf("%f", &p_in->eng); 		printf("请输入学生数学成绩：\n"); 		scanf("%f", &p_in->math); 		printf("请输入学生计算机成绩：\n"); 		scanf("%f", &p_in->computer); 		p_in->sum = p_in->eng + p_in->math + p_in->computer; 		p_in->ave = p_in->sum / 3; 		p1->next = p_in;//插入链尾 		p1 = p1->next;// 		n_i--; 	} 	p1->next = NULL;//链表终止延伸 	return head; } /***************************************数据追加功能***********************************/ void function_insert() { 	struct student *head_i; 	char c; 	system("cls"); 	head_i = insert();//调用插入函数，插入数据 	save_file(head_i);//保存文件 	printf("\n\t\t添加成功！\n"); 	for (;;) 	{ 		printf("\n\t\t是否继续添加？\n输入y继续添加，输入n结束添加\n"); 		c = getchar(); 		if (c == 'n') 			break; 		else if (c == 'y') 		{ 			system("cls"); 			head_i= insert(); 			save_file(head_i); 			printf("\n\t\t添加成功！"); 		} 		else 			printf("\n请输入有效字符(y/n)!!\n"); 	} 	system("pause"); } /***************************************数据查找功能***********************************/ void function_search() { 	struct student *head_s; 	char c; 	system("cls"); 	head_s = read_file(); 	search(head_s);//调用查找函数查找数据 	for (;;) 	{ 		printf("\n\t\t是否继续查找？\n输入y继续查找，输入n结束查找\n"); 		c = getchar(); 		if (c == 'n') 			break; 		else if (c == 'y') 		{ 			system("cls"); 			search(head_s); 		} 		else 			printf("\n请输入有效字符(y/n)!!\n"); 	} 	system("pause"); } /***************************************数据删除功能***********************************/ void function_delete() { 	char c; 	struct student *head; 	system("cls"); 	head = read_file();//从文件中读取数据 	head = del(head);//调用删除函数，删除数据 	save_file(head);//保存文件 	for (;;) 	{ 		printf("\n\t\t是否继续删除？\n输入y继续删除，输入n结束删除\n"); 		c = getchar(); 		if (c == 'n') 			break; 		else if (c == 'y') 		{ 			system("cls"); 			head = read_file(); 			head = del(head); 			save_file(head); 		} 		else 			printf("\n请输入有效字符(y/n)!!\n"); 	} 	system("pause"); 	 } /*****************************************数据输出功能*********************************/ void function_output() { 	struct student *head; 	system("cls"); 	head = read_file();//读取文件中的数据，生成链表 	print(head);//输出链表中的信息 	system("pause"); } /**************************创建文件功能**************************/ void function_build() { 		struct student *head; 			system("cls "); 			head = create();//创建链表 			system("pause "); 			save_file(head);//保存数据 			system("pause "); } /**************************菜单模块*****************************/ int menu() { 	int ab; 	system("cls"); 	printf("\t\t ===================================\n"); 	printf("\t\t           学生成绩管理系统        \n"); 	printf("\t\t ===================================\n"); 	printf("\t\t   ┌─────────────—┐\n"); 	printf("\t\t   │ 1. 创建文件    2. 添加数据 │\n"); 	printf("\t\t   │                            │\n"); 	printf("\t\t   │ 3. 显示数据    4. 数据查询 │\n"); 	printf("\t\t   │                            │\n"); 	printf("\t\t   │ 5. 删除数据    0. 退出程序 │\n"); 	printf("\t\t   └─────────────—┘\n"); 	printf("\t\t请输入对应的数字以选择所需功能:"); 	scanf("%d", &ab); 	return(ab); } /********************************************主程序**************************************/ void main() { 	for (;;)//循环使用主界面，直到命令退出 	{ 		switch (menu())//调用函数 		{ 		case 1: 			function_build(); 			break; 		case 2: 			function_insert();//调用记录添加函数 			break; 		case 3: 			function_output();//调用记录输出函数 			break; 		case 4: 			function_search();//调用记录查找函数 			break; 		case 5: 			function_delete();//调用记录删除函数 			break; 		case 0: 			printf("\n\t\t感谢使用！再见！\n");//退出主程序 			printf("\n\t\t"); 			system("pause"); 			exit(0); 		} 	} 	system("pause"); }

user: user-4
content: 不知道，是不是文件输入格式有问题？检查一下

user: user-4
content: 喔，我看错了，有文件判断。楼主调试一下代码吧，我看着头晕了，没有看出来错误

user: user-4
content: 你的程序的目录下面是否有stu.txt文件，你的程序写一个catch语句，抓取一下文件打开错误，或者判断一下文件是否存在，然后再打开。

user: user-5
content: 学习了，点赞