user-0 提问: 哪位大神帮个忙！c语言

回复:
user: user-0
content: 引用 11 楼 zhao4zhong1 的回复:仅供参考//将c:\\tmp文件夹下的所有文件的内容全部放到用malloc分配的内存中 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <io.h> struct FB {     char fn[256];     size_t fl;     char *b;     struct FB *next;     struct FB *prev; } *fh,*fb,*ft; char ln[256]; char fpn[256]; FILE *af; FILE *f; int L,n; int main() {     system("dir /b /a-d c:\\tmp\\*.* >c:\\allfn.txt");     af=fopen("c:\\allfn.txt","r");     if (NULL==af) {         printf("Can not open file c:\\allfn.txt!\n");         return 1;     }     fh=NULL;     fb=NULL;     n=0;     while (1) {         if (NULL==fgets(ln,256,af)) break;         L=strlen(ln);         if ('\n'==ln[L-1]) ln[L-1]=0;         printf("read %s\n",ln);         strcpy(fpn,"c:\\tmp\\");         strcat(fpn,ln);         ft=(struct FB *)malloc(sizeof(struct FB));         if (NULL==ft) {             printf("Can not malloc ft!\n");             fclose(af);             return 2;//之前的malloc在main退出后由操作系统自动free         }         printf("ft[%d]==%p\n",n,ft);         strcpy(ft->fn,fpn);         f=fopen(fpn,"rb");         if (NULL==f) {             printf("Can not open file %s!\n",fpn);             fclose(af);             return 3;//之前的malloc在main退出后由操作系统自动free         }         ft->fl=_filelength(fileno(f));         ft->b=malloc(ft->fl);         if (NULL==ft->b) {             printf("Can not malloc ft->b!\n");             fclose(f);             fclose(af);             return 4;//之前的malloc在main退出后由操作系统自动free         }         printf("ft[%d]->b==%p\n",n,ft->b);         if (ft->fl!=fread(ft->b,1,ft->fl,f)) {             printf("fread error!\n");             fclose(f);             fclose(af);             return 5;//之前的malloc在main退出后由操作系统自动free         }         fclose(f);         ft->next=NULL;          if (NULL==fh) {             ft->prev=NULL;             fh=ft;         } else {             fb->next=ft;             ft->prev=fb;         }         fb=ft;         n++;     }     fclose(af);     printf("-----list-----\n");     for (ft=fh;NULL!=ft;ft=ft->next) {         printf("%8d %s\n",ft->fl,ft->fn);         if (NULL!=ft) fb=ft;     }     printf("-----free-----\n");     n--;     if (NULL!=fh) {         for (ft=fb->prev;NULL!=ft;ft=ft->prev) {             if (NULL!=ft->next->b) {                 printf("ft[%d]->b==%p\n",n,ft->next->b);                 free(ft->next->b);             }             if (NULL!=ft->next) {                 printf("ft[%d]==%p\n",n,ft->next);                 free(ft->next);             }             n--;         }         if (NULL!=fh->b) {             printf("ft[0]->b==%p\n",fh->b);             free(fh->b);         }         printf("ft[0]==%p\n",fh);         free(fh);     }     return 0; } //C:\tmp\tmp\Debug>dir /a-d c:\tmp // 驱动器 C 中的卷是 C_HD5_1 // 卷的序列号是 1817-D526 // // c:\tmp 的目录 // //找不到文件 // //C:\tmp\tmp\Debug>tmp //找不到文件 //-----list----- //-----free----- // //C:\tmp\tmp\Debug>dir /a-d c:\tmp // 驱动器 C 中的卷是 C_HD5_1 // 卷的序列号是 1817-D526 // // c:\tmp 的目录 // //2011-06-30  18:04            44,840 my_c.rar //2011-06-30  17:18             1,036 err.frm //2011-06-30  14:32            14,243 出租.txt //2011-06-28  12:08            23,681 MSDN98书签.txt //             4 个文件         83,800 字节 //             0 个目录 17,041,870,848 可用字节 // //C:\tmp\tmp\Debug>tmp //read my_c.rar //ft[0]==00421800 //ft[0]->b==00520068 //read err.frm //ft[1]==00421670 //ft[1]->b==0052AFC0 //read 出租.txt //ft[2]==00421530 //ft[2]->b==00378F28 //read MSDN98书签.txt //ft[3]==004213F0 //ft[3]->b==0052B3F8 //-----list----- // 44840 c:\tmp\my_c.rar //  1036 c:\tmp\err.frm // 14243 c:\tmp\出租.txt // 23681 c:\tmp\MSDN98书签.txt //-----free----- //ft[3]->b==0052B3F8 //ft[3]==004213F0 //ft[2]->b==00378F28 //ft[2]==00421530 //ft[1]->b==0052AFC0 //ft[1]==00421670 //ft[0]->b==00520068 //ft[0]==00421800 // //C:\tmp\tmp\Debug> 非常感谢

user: user-1
content: 仅供参考//将c:\\tmp文件夹下的所有文件的内容全部放到用malloc分配的内存中 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <io.h> struct FB {     char fn[256];     size_t fl;     char *b;     struct FB *next;     struct FB *prev; } *fh,*fb,*ft; char ln[256]; char fpn[256]; FILE *af; FILE *f; int L,n; int main() {     system("dir /b /a-d c:\\tmp\\*.* >c:\\allfn.txt");     af=fopen("c:\\allfn.txt","r");     if (NULL==af) {         printf("Can not open file c:\\allfn.txt!\n");         return 1;     }     fh=NULL;     fb=NULL;     n=0;     while (1) {         if (NULL==fgets(ln,256,af)) break;         L=strlen(ln);         if ('\n'==ln[L-1]) ln[L-1]=0;         printf("read %s\n",ln);         strcpy(fpn,"c:\\tmp\\");         strcat(fpn,ln);         ft=(struct FB *)malloc(sizeof(struct FB));         if (NULL==ft) {             printf("Can not malloc ft!\n");             fclose(af);             return 2;//之前的malloc在main退出后由操作系统自动free         }         printf("ft[%d]==%p\n",n,ft);         strcpy(ft->fn,fpn);         f=fopen(fpn,"rb");         if (NULL==f) {             printf("Can not open file %s!\n",fpn);             fclose(af);             return 3;//之前的malloc在main退出后由操作系统自动free         }         ft->fl=_filelength(fileno(f));         ft->b=malloc(ft->fl);         if (NULL==ft->b) {             printf("Can not malloc ft->b!\n");             fclose(f);             fclose(af);             return 4;//之前的malloc在main退出后由操作系统自动free         }         printf("ft[%d]->b==%p\n",n,ft->b);         if (ft->fl!=fread(ft->b,1,ft->fl,f)) {             printf("fread error!\n");             fclose(f);             fclose(af);             return 5;//之前的malloc在main退出后由操作系统自动free         }         fclose(f);         ft->next=NULL;          if (NULL==fh) {             ft->prev=NULL;             fh=ft;         } else {             fb->next=ft;             ft->prev=fb;         }         fb=ft;         n++;     }     fclose(af);     printf("-----list-----\n");     for (ft=fh;NULL!=ft;ft=ft->next) {         printf("%8d %s\n",ft->fl,ft->fn);         if (NULL!=ft) fb=ft;     }     printf("-----free-----\n");     n--;     if (NULL!=fh) {         for (ft=fb->prev;NULL!=ft;ft=ft->prev) {             if (NULL!=ft->next->b) {                 printf("ft[%d]->b==%p\n",n,ft->next->b);                 free(ft->next->b);             }             if (NULL!=ft->next) {                 printf("ft[%d]==%p\n",n,ft->next);                 free(ft->next);             }             n--;         }         if (NULL!=fh->b) {             printf("ft[0]->b==%p\n",fh->b);             free(fh->b);         }         printf("ft[0]==%p\n",fh);         free(fh);     }     return 0; } //C:\tmp\tmp\Debug>dir /a-d c:\tmp // 驱动器 C 中的卷是 C_HD5_1 // 卷的序列号是 1817-D526 // // c:\tmp 的目录 // //找不到文件 // //C:\tmp\tmp\Debug>tmp //找不到文件 //-----list----- //-----free----- // //C:\tmp\tmp\Debug>dir /a-d c:\tmp // 驱动器 C 中的卷是 C_HD5_1 // 卷的序列号是 1817-D526 // // c:\tmp 的目录 // //2011-06-30  18:04            44,840 my_c.rar //2011-06-30  17:18             1,036 err.frm //2011-06-30  14:32            14,243 出租.txt //2011-06-28  12:08            23,681 MSDN98书签.txt //             4 个文件         83,800 字节 //             0 个目录 17,041,870,848 可用字节 // //C:\tmp\tmp\Debug>tmp //read my_c.rar //ft[0]==00421800 //ft[0]->b==00520068 //read err.frm //ft[1]==00421670 //ft[1]->b==0052AFC0 //read 出租.txt //ft[2]==00421530 //ft[2]->b==00378F28 //read MSDN98书签.txt //ft[3]==004213F0 //ft[3]->b==0052B3F8 //-----list----- // 44840 c:\tmp\my_c.rar //  1036 c:\tmp\err.frm // 14243 c:\tmp\出租.txt // 23681 c:\tmp\MSDN98书签.txt //-----free----- //ft[3]->b==0052B3F8 //ft[3]==004213F0 //ft[2]->b==00378F28 //ft[2]==00421530 //ft[1]->b==0052AFC0 //ft[1]==00421670 //ft[0]->b==00520068 //ft[0]==00421800 // //C:\tmp\tmp\Debug>

user: user-2
content: 格式化你的输入，晚上再帮你看一下。还有，每次回复的时候最后单击“引用”，就是右下角那个，这样对方就知道你回复他了。

user: user-2
content: 还有你知道为什么,上述程序成功将信息写入了进去,同时也能成功显示出来,但是打开文件,你依然会看到一堆没有意义是字符吗? 因为你malloc出来的空间,里面的内容是未定义的,你的SIZE=30,比如char name[SIZE];然而你写入的name也许就5个字符,然后还有25个字符的位置是没有定义的(内存中未定义的字符),在你写入文件的时候,都写进去了,然后打开文件就会看到一堆乱起八糟的东西.

user: user-2
content: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h>  #define SIZE 30 #define INFORMATION printf("number  name  gender  home  title  school  \n")   typedef struct teacher  { 	long number ; 	char name[SIZE]; 	char gender[SIZE]; 	char home[SIZE]; 	char title[SIZE]; 	char school[SIZE]; } Teacher ; typedef struct node  { 	Teacher item ; 	struct node*next ; } Node ; typedef Node*List ;    void InitializeList(List*Head); int Menu(void); void Add(List*Head); void ShowAll(void); void SearchMenu(List*Head); Node*FileToMemory(List*Head); void EmptyTheList(List*Head);    int main(void) { 	List head ; 	InitializeList(&head);  	while(1) 	{ 		int getchoose ; 		getchoose=Menu(); 		switch(getchoose) 		{ 		case 1 : 			system("cls"); 			Add(&head); 			break ; 		case 2 : 			system("cls"); 			ShowAll(); 			break ; 		case 3 : 			system("cls"); 			SearchMenu(&head); 			break ; 		case 4 : 			exit(0); 			break ; 		} 	} 	return 0 ; } void InitializeList(List*Head) { 	*Head=NULL ; } int Menu(void) { 	int choose ; 	do  	{ 		system("cls"); 		printf("************************************\n"); 		printf("         教师信息管理系统           \n"); 		printf("         1)添加教师信息             \n"); 		printf("         2)显示教师信息             \n"); 		printf("         3)查询                     \n"); 		printf("         4)退出                     \n"); 		printf("************************************\n"); 		fflush(stdin); 		printf("请选择:\n"); 		scanf("%d",&choose); 		if(choose!=1&&choose!=2&&choose!=3&&choose!=4) 		{ 			printf("您的输入错误，请重新输入！\n"); 		} 	} 	while(choose!=1&&choose!=2&&choose!=3&&choose!=4); 	return choose ; } void Add(List*Head) { 	int size=0 ; 	FILE*tea ; 	Node*add ; 	add=FileToMemory(Head); 	//add函数你根本可以不打印出这些内容来.否则你的show用来干嘛呢?-----建议而已,每个函数各司其职,这样能不乱掉 	if(add!=NULL) 	{ 		printf("%d %s %s %s %s %s \n",add->item.number,add->item.name, 			add->item.gender,add->item.home,add->item.title,add->item.school); 		add=add->next ; 		size++; 	} 	printf("%d\n",size); 	if((tea=fopen("teachers.txt","a+"))==NULL) 		printf("!!打开失败！"); 	rewind(tea);						//你要是用这个函数呢? 	printf("请输入教师信息\n"); 	while(size<2) 	{ 		add=(Node*)malloc(sizeof(Node)); 		if(add==NULL) 			exit(2); 		fflush(stdin); 		scanf("%d %s %s %s %s %s",&add->item.number,add->item.name, 			add->item.gender,add->item.home,add->item.title,add->item.school); 		fwrite(add,sizeof(Node),1,tea); 		printf("请再次输入：\n"); 		//add=add->next ;				//请问add->next后面是什么呢?你的add都没有后面什么也没有,这里应该将add释放掉. 		free(add); 		size++; 	} 	EmptyTheList(Head); 	fclose(tea); 	printf("输入信息成功!\n"); 	printf("请按任意键返回主菜单！\n"); 	getch(); } void ShowAll(void) { 	FILE*tea ; 	Node*first ; 	int size=0 ; 	tea=fopen("teachers.txt","r");				 	if(tea==NULL) 		printf("打开失败！\n"); 	else  	{ 		rewind(tea); 		INFORMATION ; 		while(size<2) 		{ 			first=(Node*)malloc(sizeof(Node)); 			fread(first,sizeof(Node),1,tea); 			printf("%d %s %s %s %s %s \n",first->item.number,first->item.name, 				first->item.gender,first->item.home,first->item.title,first->item.school); 			first=first->next ; 			size++; 		} 		printf("%d\n",size); 		fclose(tea); 		printf("所有教师信息读取成功!\n"); 	} 	printf("请按任意键返回主菜单!\n"); 	getch(); } void SearchMenu(List*Head) { 	system("cls"); 	printf("***********************************\n"); 	printf("         查询方式：                \n"); 	printf("         1)按教师号查询            \n"); 	printf("         2)按院系查询              \n"); 	printf("         3)按职称查询              \n"); 	printf("***********************************\n"); 	int choose,id,count=0 ; 	Node*first ; 	fflush(stdin); 	printf("请选择：\n"); 	scanf("%d",&choose); 	first=FileToMemory(Head); 	if(choose==1) 	{ 		fflush(stdin); 		printf("请输入你要查找教师的教师号：\n"); 		scanf("%d",&id); 		while(first!=NULL) 		{ 			printf("下面是您要查找的教师信息：\n"); 			INFORMATION ; 			if(id==first->item.number) 			{ 				printf("%d %s %s %s %s %s \n",first->item.number,first->item.name, 					first->item.gender,first->item.home,first->item.title,first->item.school); 				count++; 			} 			first=first->next ; 		} 		if(count==0) 			printf("没有找到您需要的信息！\n"); 	} 	else if(choose==2) 	{ 		char name[SIZE]; 		fflush(stdin); 		printf("请输入你要查找教师的名字：\n"); 		scanf("%s",name); 		while(first!=NULL) 		{ 			printf("下面是您要查找的教师信息：\n"); 			INFORMATION ; 			if(strcmp(name,first->item.name)==0) 			{ 				printf("%d %s %s %s %s %s \n",first->item.number,first->item.name, 					first->item.gender,first->item.home,first->item.title,first->item.school); 				count++; 			} 			first=first->next ; 		} 		if(count==0) 			printf("没有找到您需要的信息！\n"); 	} 	else if(choose==3) 	{ 		char title[SIZE]; 		fflush(stdin); 		printf("请输入你要查找教师的名字：\n"); 		scanf("%s",title); 		while(first!=NULL) 		{ 			printf("下面是您要查找的教师信息：\n"); 			INFORMATION ; 			if(strcmp(title,first->item.title)==0) 			{ 				printf("%d %s %s %s %s %s \n",first->item.number,first->item.name, 					first->item.gender,first->item.home,first->item.title,first->item.school); 				count++; 			} 			first=first->next ; 		} 		if(count==0) 			printf("没有找到您需要的信息！\n"); 	} 	else  		printf("您的输入错误！\n"); 	printf("请按任意键返回主菜单!\n"); 	getch(); } Node* FileToMemory(List*Head) { 	FILE *tea; 	Node *first = *Head; 	Node *pnew; 	tea = fopen("teachers.txt", "r"); 	if (tea == NULL) 		printf("打开失败!\n"); 	else if (getc(tea) == EOF) 		return *Head; 	else  	{ 		while (!feof(tea)) 		{ 			pnew = (Node*)malloc(sizeof(Node)); 			if (pnew == NULL) 			{ 				printf("申请内存失败！\n"); 				exit(1); 			} 			fread(pnew, sizeof(Node), 1, tea); 			printf("%d %s %s %s %s %s\n", pnew->item.number, pnew->item.name, 				pnew->item.gender, pnew->item.home, pnew->item.title, pnew->item.school); 			pnew->next = NULL; 			if (first == NULL)//开始时头为空，则将文件中读到的第一个信息的地址给头 			{ 				*Head = pnew; 			} 			else 			{ 				while (first->next != NULL)//之后往后面移 					first = first->next; 				first->next = pnew; 			} 		} 	} 	fclose(tea) ; 	return *Head; } 	void EmptyTheList(List*Head) 	{ 		Node *pt ; 		while(*Head!=NULL) 		{ 			pt=(*Head)->next ; 			free(*Head); 			*Head=pt ; 		} 	}  主菜单的1和2都没问题了.查询教师信息的你自己弄出来吧.

user: user-0
content: Node *FileToMemory(List * Head) { 	FILE *tea; 	Node *first = *Head; 	Node *pnew; 	tea = fopen("teachers.txt", "r"); 	if (tea == NULL) 		printf("打开失败!\n"); 	else if (getc(tea) == EOF) 		return *Head; 	else  	{ 		while (!feof(tea)) 		{ 			pnew = (Node*)malloc(sizeof(Node)); 			if (pnew == NULL) 			{ 				printf("申请内存失败！\n"); 				exit(1); 			} 			fread(pnew, sizeof(Node), 1, tea); 			printf("%d %s %s %s %s %s\n", pnew->item.number, pnew->item.name, 				pnew->item.gender, pnew->item.home, pnew->item.title, pnew->item.school); 			pnew->next = NULL; 			if (first == NULL)//开始时头为空，则将文件中读到的第一个信息的地址给头 			{ 				*Head = pnew; 			} 			else 			{ 				while (first->next != NULL)//之后往后面移 					first = first->next; 				first->next = pnew; 			} 		} 	} 	fclose(tea) ; 	return *Head; } 大哥，改了一下，那些没用的信息没了，但现在是返回的*Head不是指向第一个节点，而且读取之后显示有问题，数字显示不对，字符串首字母没了。麻烦再帮我看看！多谢了！！！

user: user-0
content: 还没仔细看，但是能有大神给我这个新手这么仔细看，感觉非常感谢。这对新手帮助太大了！！！！

user: user-2
content: 给你该动了一个函数,但是这是治标的,控制台显示读取文件出错.虽然没有报错,也没有崩溃,出现的问题,我在后面给你说一下. Node* FileToMemory(List*Head) { 	FILE *tea ;				//不要起一些随便的变量名！ 	Node *first=*Head ; 	// Node *new ;			//不要使用C++特有的关键字作为你的变量名字！ 	Node  *newTest; 	//tea=fopen("teachers.txt","r");	//当你往文件中写入信息的时候，应该使用W模式，或者W+模式.比如当你添加教师信息的时候也会用到进入到该函数,此时该模式会导致崩溃. 	tea = fopen("teachers.txt","w+"); 	if(tea==NULL) 		printf("打开失败!\n"); 	else					//使用大括号将if-else部分扩起来，否则谁知道你的范围是什么 	{ 		while(!feof(tea)) 		{ 			newTest=(Node*)malloc(sizeof(Node)); 			if(newTest==NULL) 			{ 				printf("申请内存失败！\n"); 				exit(1); 			} 			fread(newTest,sizeof(Node),1,tea); 			newTest->next=NULL ; 			if(first==NULL) 			{ 				*Head=newTest ; 			} 			else  			{ 				while(first->next!=NULL) 					first=first->next ; 				first->next=newTest ; 			} 		} 	} 	fclose(tea); 	return*Head ; } 你跟踪一下你的代码,你会发现在你选择了1之后,程序会执行到这个函数里面,假如我文件中没有任何数据的话,程序按照你的写法还是会去读文件的,此时就会导致读取的都是一堆没有用的数据,这些信息最终会让你看到控制台显示一堆的: -842150451 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯 屯屯 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯 屯屯屯屯屯屯屯屯 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯  1 请输入教师信息 .因此你这个函数应该分成两部分写,当增加教师信息的时候,仅仅向文件中写信息.读的时候,使用另一套逻辑(另外一个负责读的函数).这是最基本的问题. 其他的问题就是我在上面注释掉的那些. 还有一个需要注意的地方是:再去看看文件的操纵吧,把文本文件和二进制文件以及他们的读写模式搞懂.

user: user-3
content: 引用 5 楼 baijiaheizhiganmao 的回复:亲，格式化一下你的代码如何？我的vim编辑器无法自动调整格式。#include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h>  #define SIZE 30 #define INFORMATION printf("number  name  gender  home  title  school  \n")   typedef struct teacher  {     long number ;     char name[SIZE];     char gender[SIZE];     char home[SIZE];     char title[SIZE];     char school[SIZE]; } Teacher ; typedef struct node  {     Teacher item ;     struct node*next ; } Node ; typedef Node*List ;    void InitializeList(List*Head); int Menu(void); void Add(List*Head); void ShowAll(void); void SearchMenu(List*Head); Node*FileToMemory(List*Head); void EmptyTheList(List*Head);    int main(void) {     List head ;     InitializeList(&head);          while(1)     {         int getchoose ;         getchoose=Menu();         switch(getchoose)         {             case 1 :             system("cls");             Add(&head);             break ;             case 2 :             system("cls");             ShowAll();             break ;             case 3 :             system("cls");             SearchMenu(&head);             break ;             case 4 :             exit(0);             break ;         }     }     return 0 ; } void InitializeList(List*Head) {     *Head=NULL ; } int Menu(void) {     int choose ;     do      {         system("cls");         printf("************************************\n");         printf("         教师信息管理系统           \n");         printf("         1)添加教师信息             \n");         printf("         2)显示教师信息             \n");         printf("         3)查询                     \n");         printf("         4)退出                     \n");         printf("************************************\n");         fflush(stdin);         printf("请选择:\n");         scanf("%d",&choose);         if(choose!=1&&choose!=2&&choose!=3&&choose!=4)         {             printf("您的输入错误，请重新输入！\n");         }     }     while(choose!=1&&choose!=2&&choose!=3&&choose!=4);     return choose ; } void Add(List*Head) {     int size=0 ;     FILE*tea ;     Node*add ;     add=FileToMemory(Head);     if(add!=NULL)     {         printf("%d %s %s %s %s %s \n",add->item.number,add->item.name,         add->item.gender,add->item.home,add->item.title,add->item.school);         add=add->next ;         size++;     }     printf("%d\n",size);     if((tea=fopen("teachers.txt","a+"))==NULL)     printf("!!打开失败！");     rewind(tea);     printf("请输入教师信息\n");     while(size<2)     {         add=(Node*)malloc(sizeof(Node));         if(add==NULL)         exit(2);         fflush(stdin);         scanf("%d %s %s %s %s %s",&add->item.number,add->item.name,         add->item.gender,add->item.home,add->item.title,add->item.school);         fwrite(add,sizeof(Node),1,tea);         printf("请再次输入：\n");         add=add->next ;         size++;     }     EmptyTheList(Head);     fclose(tea);     printf("输入信息成功!\n");     printf("请按任意键返回主菜单！\n");     getch(); } void ShowAll(void) {     FILE*tea ;     Node*first ;     int size=0 ;     tea=fopen("teachers.txt","r");     if(tea==NULL)     printf("打开失败！\n");     else      {         rewind(tea);         INFORMATION ;         while(size<2)         {             first=(Node*)malloc(sizeof(Node));             fread(first,sizeof(Node),1,tea);             printf("%d %s %s %s %s %s \n",first->item.number,first->item.name,             first->item.gender,first->item.home,first->item.title,first->item.school);             first=first->next ;             size++;         }         printf("%d\n",size);         fclose(tea);         printf("所有教师信息读取成功!\n");     }     printf("请按任意键返回主菜单!\n");     getch(); } void SearchMenu(List*Head) {     system("cls");     printf("***********************************\n");     printf("         查询方式：                \n");     printf("         1)按教师号查询            \n");     printf("         2)按院系查询              \n");     printf("         3)按职称查询              \n");     printf("***********************************\n");     int choose,id,count=0 ;     Node*first ;     fflush(stdin);     printf("请选择：\n");     scanf("%d",&choose);     first=FileToMemory(Head);     if(choose==1)     {         fflush(stdin);         printf("请输入你要查找教师的教师号：\n");         scanf("%d",&id);         while(first!=NULL)         {             printf("下面是您要查找的教师信息：\n");             INFORMATION ;             if(id==first->item.number)             {                 printf("%d %s %s %s %s %s \n",first->item.number,first->item.name,                 first->item.gender,first->item.home,first->item.title,first->item.school);                 count++;             }             first=first->next ;         }         if(count==0)         printf("没有找到您需要的信息！\n");     }     else if(choose==2)     {         char name[SIZE];         fflush(stdin);         printf("请输入你要查找教师的名字：\n");         scanf("%s",name);         while(first!=NULL)         {             printf("下面是您要查找的教师信息：\n");             INFORMATION ;             if(strcmp(name,first->item.name)==0)             {                 printf("%d %s %s %s %s %s \n",first->item.number,first->item.name,                 first->item.gender,first->item.home,first->item.title,first->item.school);                 count++;             }             first=first->next ;         }         if(count==0)         printf("没有找到您需要的信息！\n");     }     else if(choose==3)     {         char title[SIZE];         fflush(stdin);         printf("请输入你要查找教师的名字：\n");         scanf("%s",title);         while(first!=NULL)         {             printf("下面是您要查找的教师信息：\n");             INFORMATION ;             if(strcmp(title,first->item.title)==0)             {                 printf("%d %s %s %s %s %s \n",first->item.number,first->item.name,                 first->item.gender,first->item.home,first->item.title,first->item.school);                 count++;             }             first=first->next ;         }         if(count==0)         printf("没有找到您需要的信息！\n");     }     else      printf("您的输入错误！\n");     printf("请按任意键返回主菜单!\n");     getch(); } Node*FileToMemory(List*Head) {     FILE*tea ;     Node*first=*Head ;     Node*new ;     tea=fopen("teachers.txt","r");     if(tea==NULL)     printf("打开失败!\n");     else      while(!feof(tea))     {         new=(Node*)malloc(sizeof(Node));         if(new==NULL)         {             printf("申请内存失败！\n");             exit(1);         }         fread(new,sizeof(Node),1,tea);         new->next=NULL ;         if(first==NULL)         {             *Head=new ;         }         else          {             while(first->next!=NULL)             first=first->next ;             first->next=new ;         }     }     fclose(tea);     return*Head ; } void EmptyTheList(List*Head) {     Node*pt ;     while(*Head!=NULL)     {         pt=(*Head)->next ;         free(*Head);         *Head=pt ;     } }

user: user-2
content: 亲，格式化一下你的代码如何？我的vim编辑器无法自动调整格式。

user: user-4
content: new是C++的。

user: user-0
content: 格式有什么问题吗？还有new是C++的关键字，不是c的关键字啊

user: user-5
content: new 是 C 语言的关键字吗？ 我怎么不知道呀？

user: user-6
content: 引用 楼主 yjaal 的回复:我学c语言不太好，对指针和文件这块弄不太懂，所以就想用链表编一个那种信息管理程序练练手。可是编出来总是出问题。程序可能有点长，问题也很多，看起来也挺麻烦的，可是我没有谁可以问。哪位大神能帮我看看？帮我这个菜鸟度过指针这个南关啊！！！程序如下： #include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h>  #define SIZE 30 #define INFORMATION printf("number  name  gender  home  title  school  \n")   typedef struct teacher{ 	long number; 	char name[SIZE]; 	char gender[SIZE]; 	char home[SIZE]; 	char title[SIZE]; 	char school[SIZE]; }Teacher; typedef struct node{ 	Teacher item; 	struct node *next; }Node; typedef Node *List;    void InitializeList(List *Head); int Menu(void); void Add(List *Head); void ShowAll(void); void SearchMenu(List * Head); Node *FileToMemory(List * Head); void EmptyTheList(List *Head);    int main(void) { 	List head; 	InitializeList(&head);  	while (1){ 		int getchoose; 		getchoose = Menu(); 		switch (getchoose){ 		case 1: 			system("cls"); 			Add(&head); 			break; 		case 2: 			system("cls"); 			ShowAll(); 			break; 		case 3: 			system("cls"); 			SearchMenu(&head); 			break; 		case 4: 			exit(0); 			break; 		} 	} 	return 0; } void InitializeList(List *Head) { 	*Head = NULL; } int Menu(void) { 	int choose; 	do{ 		system("cls"); 		printf("************************************\n"); 		printf("         教师信息管理系统           \n"); 		printf("         1)添加教师信息             \n"); 		printf("         2)显示教师信息             \n"); 		printf("         3)查询                     \n"); 		printf("         4)退出                     \n"); 		printf("************************************\n"); 		fflush(stdin); 		printf("请选择:\n"); 		scanf("%d", &choose); 		if (choose != 1 && choose != 2 && choose != 3 && choose != 4){ 			printf("您的输入错误，请重新输入！\n"); 		} 	} while (choose != 1 && choose != 2 && choose != 3 && choose != 4); 	return choose; } void Add(List *Head) { 	int size = 0; 	FILE *tea; 	Node *add; 	add = FileToMemory(Head); 	if (add != NULL) 	{ 		printf("%d %s %s %s %s %s \n", add->item.number, add->item.name, 			add->item.gender, add->item.home, add->item.title, add->item.school); 		add = add->next; 		size++; 	} 	printf("%d\n", size); 	if ((tea = fopen("teachers.txt", "a+")) == NULL) 		printf("!!打开失败！"); 	rewind(tea); 	printf("请输入教师信息\n"); 	while (size<2){ 		add = (Node*)malloc(sizeof(Node)); 		if (add == NULL) 			exit(2); 		fflush(stdin); 		scanf("%d %s %s %s %s %s", &add->item.number, add->item.name, 			add->item.gender, add->item.home, add->item.title, add->item.school); 		fwrite(add, sizeof(Node), 1, tea); 		printf("请再次输入：\n"); 		add = add->next; 		size++; 	} 	EmptyTheList(Head); 	fclose(tea); 	printf("输入信息成功!\n"); 	printf("请按任意键返回主菜单！\n"); 	getch(); } void ShowAll(void) { 	FILE *tea; 	Node *first; 	int size = 0; 	tea = fopen("teachers.txt", "r"); 	if (tea == NULL) 		printf("打开失败！\n"); 	else{ 		rewind(tea); 		INFORMATION; 		while (size<2){ 			first = (Node*)malloc(sizeof(Node)); 			fread(first, sizeof(Node), 1, tea); 			printf("%d %s %s %s %s %s \n", first->item.number, first->item.name, 				first->item.gender, first->item.home, first->item.title, first->item.school); 			first = first->next; 			size++; 		} 		printf("%d\n", size); 		fclose(tea); 		printf("所有教师信息读取成功!\n"); 	} 	printf("请按任意键返回主菜单!\n"); 	getch(); } void SearchMenu(List * Head) { 	system("cls"); 	printf("***********************************\n"); 	printf("         查询方式：                \n"); 	printf("         1)按教师号查询            \n"); 	printf("         2)按院系查询              \n"); 	printf("         3)按职称查询              \n"); 	printf("***********************************\n"); 	int choose, id, count = 0; 	Node *first; 	fflush(stdin); 	printf("请选择：\n"); 	scanf("%d", &choose); 	first = FileToMemory(Head); 	if (choose == 1) 	{ 		fflush(stdin); 		printf("请输入你要查找教师的教师号：\n"); 		scanf("%d", &id); 		while (first != NULL){ 			printf("下面是您要查找的教师信息：\n"); 			INFORMATION; 			if (id == first->item.number){ 				printf("%d %s %s %s %s %s \n", first->item.number, first->item.name, 					first->item.gender, first->item.home, first->item.title, first->item.school); 				count++; 			} 			first = first->next; 		} 		if (count == 0) 			printf("没有找到您需要的信息！\n"); 	} 	else if (choose == 2) 	{ 		char name[SIZE]; 		fflush(stdin); 		printf("请输入你要查找教师的名字：\n"); 		scanf("%s", name); 		while (first != NULL){ 			printf("下面是您要查找的教师信息：\n"); 			INFORMATION; 			if (strcmp(name, first->item.name) == 0){ 				printf("%d %s %s %s %s %s \n", first->item.number, first->item.name, 					first->item.gender, first->item.home, first->item.title, first->item.school); 				count++; 			} 			first = first->next; 		} 		if (count == 0) 			printf("没有找到您需要的信息！\n"); 	} 	else if (choose == 3) 	{ 		char title[SIZE]; 		fflush(stdin); 		printf("请输入你要查找教师的名字：\n"); 		scanf("%s", title); 		while (first != NULL){ 			printf("下面是您要查找的教师信息：\n"); 			INFORMATION; 			if (strcmp(title, first->item.title) == 0){ 				printf("%d %s %s %s %s %s \n", first->item.number, first->item.name, 					first->item.gender, first->item.home, first->item.title, first->item.school); 				count++; 			} 			first = first->next; 		} 		if (count == 0) 			printf("没有找到您需要的信息！\n"); 	} 	else 		printf("您的输入错误！\n"); 	printf("请按任意键返回主菜单!\n"); 	getch(); } Node *FileToMemory(List * Head) { 	FILE *tea; 	Node *first = *Head; 	Node *new; 	tea = fopen("teachers.txt", "r"); 	if (tea == NULL) 		printf("打开失败!\n"); 	else 		while (!feof(tea)){ 		new = (Node*)malloc(sizeof(Node)); 		if (new == NULL){ 			printf("申请内存失败！\n"); 			exit(1); 		} 		fread(new, sizeof(Node), 1, tea); 		new->next = NULL; 		if (first == NULL) 		{ 			*Head = new; 		} 		else{ 			while (first->next != NULL) 				first = first->next; 			first->next = new; 		} 		} 	fclose(tea); 	return *Head; } void EmptyTheList(List *Head) { 	Node *pt; 	while (*Head != NULL) 	{ 		pt = (*Head)->next; 		free(*Head); 		*Head = pt; 	} }  1.首先 不要使用关键字作为变量 ，new是c语言的关键字所以你的改成其他的名字。然后就没问题了 2上传代码是要注意格式不然没人愿意看，太费事了。