user-0 提问: 求解c语言文件问题

回复:
user: user-1
content: 你结构体下面 mess *head 要用malloc 生成 不能直接这样

user: user-2
content: 厉害啊  我的哥0 0

user: user-3
content: 和我一样  都在写成绩管理系统  我在文件的时候困了老半天

user: user-4
content: 看了好几遍也没发现无误

user: user-5
content: fprintf(fp,"%ld\t%s\t%s\t%d%d\t    %s\t%s\t%s\t\r\n",         p->number,p->name,p->sex,p->year,p->month,p->add,         p->phone,p->mail);         p=p->next;  愁死个人， 这样写，两个数字都挨在一起了。 一个2一个3， 你这样写输出的是23， 回头fscanf能分出来才见鬼了呢 就一个输出整那么多没有的干嘛呢 这种数据文件你还讲究个什么排版啊， 老老实实的去写： fprintf(fp,"%ld %s %s %d %d %s %s %s\n", \          p->number, \          p->name,  p->sex, \          p->year,    p->month, \          p->add,     p->phone,   p->mail);

user: user-6
content: 是不是突破了64k文件长度限制？有多少数据项？通常c语言文件长度不大于64k，否则会出错。需要使用长文件时，需要使用专用的头文件。

user: user-7
content: 用二进制读写，调整一下输出的指针的起始位置

user: user-7
content: 用二进制读写

user: user-0
content: 引用 20 楼 m0_46108109的回复:void save() { 	mess* p = head; 	fp = fopen("d:\\stu.txt", "ab+");  //<<-- 	system("cls"); 	if (head == NULL)   //<<-- 	{ 		printf("保存失败，信息为空。"); 		system("pause"); 		system("cls"); 		return; 	} 	while (p != NULL) 	{ 		fprintf(fp, "%ld\t%s\t%s\t%d\t%d\t%s\t%s\t%s\t\r\n", 			p->number, p->name, p->sex, p->year, p->month, p->add, 			p->phone, p->mail); 		p = p->next; 	} 	fclose(fp); 	printf("保存成功。\n"); 	system("pause"); 	system("cls"); 	return; } 你数据没有保存对 这里修改了哪里

user: user-0
content: 我有点晕了。现在是数据储存位置错了，提取没有问题

user: user-0
content: 引用 22 楼 寻开心的回复:draw函数启动的时候，屏幕输出什么了？  Start reading data from file ...... 1 陈 ------Finish--------  还是什么也木有 屏幕输出的就是你说的这个

user: user-5
content: while中间， 在scanf之后，还有一个printf呢，那个有没有输出内容？  如果这里都可以正常输出，那么错误也没有发生在draw函数里面啊 你的那个异常，是执行到哪儿出现的

user: user-5
content: draw函数启动的时候，屏幕输出什么了？  Start reading data from file ...... 1 陈 ------Finish--------  还是什么也木有

user: user-0
content: 引用 13 楼 寻开心 的回复:head一开始是NULL，但是你的录入操作等，折腾后就不是NULL了 还有那个n，表示有多少个， 这个要和head一样初始化为0 draw读取到时候，也要对n进行同步，才能计数  你的这个数据文件，你打开看了没有，里面都是什么样子的数据，确定正确吗？ 很是怀疑呢， 前面的input都是错的， 后面的save怎么可能正确执行下来的 如果save执行的不对， 比如，写入的name的长度超长，超过了数组的大小， 读取进来必然会把mess变量撑死 现在是严重的怀疑你的数据文件就不对   还有就是你怎么确定的问题是出在draw函数里面的呢？ 你可以在draw函数上做一点改造：  printf("\nStart reading data from file ......\n")  while(!feof(fp))     {         p=(mess*)malloc(sizeof(mess));         fscanf(fp,"%ld %s %s %d %d %s %s %s\r\n",         &p->number,p->name,p->sex,&p->year,&p->month,p->add,         p->phone,p->mail); printf("%d %s\n", p->num, p->name);         p->next=head;         head=p;     } printf("\n------Finish--------\n");   看看屏幕输出了什么  数据错了

user: user-8
content: void save() { 	mess* p = head; 	fp = fopen("d:\\stu.txt", "ab+");  //<<-- 	system("cls"); 	if (head == NULL)   //<<-- 	{ 		printf("保存失败，信息为空。"); 		system("pause"); 		system("cls"); 		return; 	} 	while (p != NULL) 	{ 		fprintf(fp, "%ld\t%s\t%s\t%d\t%d\t%s\t%s\t%s\t\r\n", 			p->number, p->name, p->sex, p->year, p->month, p->add, 			p->phone, p->mail); 		p = p->next; 	} 	fclose(fp); 	printf("保存成功。\n"); 	system("pause"); 	system("cls"); 	return; } 你数据没有保存对

user: user-8
content: fprintf(fp, "%ld\t%s\t%s\t%d\t%d\t%s\t%s\t%s\t\r\n", 这里错了。

user: user-0
content: 引用 13 楼 寻开心的回复:head一开始是NULL，但是你的录入操作等，折腾后就不是NULL了 还有那个n，表示有多少个， 这个要和head一样初始化为0 draw读取到时候，也要对n进行同步，才能计数  你的这个数据文件，你打开看了没有，里面都是什么样子的数据，确定正确吗？ 很是怀疑呢， 前面的input都是错的， 后面的save怎么可能正确执行下来的 如果save执行的不对， 比如，写入的name的长度超长，超过了数组的大小， 读取进来必然会把mess变量撑死 现在是严重的怀疑你的数据文件就不对   还有就是你怎么确定的问题是出在draw函数里面的呢？ 你可以在draw函数上做一点改造：  printf("\nStart reading data from file ......\n")  while(!feof(fp))     {         p=(mess*)malloc(sizeof(mess));         fscanf(fp,"%ld %s %s %d %d %s %s %s\r\n",         &p->number,p->name,p->sex,&p->year,&p->month,p->add,         p->phone,p->mail); printf("%d %s\n", p->num, p->name);         p->next=head;         head=p;     } printf("\n------Finish--------\n");   看看屏幕输出了什么 输出了打印的那两句英文

user: user-0
content: 引用 15 楼 m0_46108109的回复:void save() {     mess *p=head;     fp=fopen("d:\\stu.txt","ab+"); 前面保存的就不对。 难道用二进制打开，可以用文本方式读写吗？ 文件里是我输入的内容

user: user-8
content: 哦哦，我想起来了，这个问题我曾经问过。在linux下只有一种文件格式。 at等同于ab，这个源码应该是linux上的所以没问题。

user: user-8
content: void save() {     mess *p=head;     fp=fopen("d:\\stu.txt","ab+"); 前面保存的就不对。 难道用二进制打开，可以用文本方式读写吗？