user-0 提问: C语言操作文件时怎么清空之前的数据呢

回复:
user: user-1
content: 不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。

user: user-0
content: #include "stdio.h" #include "student.h" #include "stdlib.h" #include "file.h" #include "string.h"  #define SIZE sizeof(struct student) struct student *head,*last; void screen(); int n=0; void stucpy(struct student *stu1,struct student *stu2) { 		stu1->num=stu2->num; 		strcpy(stu1->name,stu2->name); 		stu1->age=stu2->age; 		strcpy(stu1->sex,stu2->sex); 		stu1->score=stu2->score; } void swap(struct student *stu1,struct student *stu2) { 	struct student stu={0,"",0,'M',0}; 	struct student *temp; 	temp=&stu; 	stucpy(temp,stu1); 	stucpy(stu1,stu2); 	stucpy(stu2,temp); } /*void sortStu() { 	struct student *p1,*k; 	int i,j; 	for(p1=head,i=0;i<n-1;p1=p1->next) 	{ 		k=p1->next; 		for(j=1;j<n;j++) 		{ 			 			if(k->num<p1->num) 			{ 				swap(k,p1); 			} 			k=k->next; 		} 		i++; 	} }*/ void printstu(struct student *stu) { 	printf("%ld\t%s\t%s\t%d\t%4.1f\n",stu->num,stu->name,stu->sex,stu->age,stu->score); } void selectAll() { 	 	printf("NO.\tName\tSex\tAge\tScore\n"); 	struct student *stus; 	stus=head; 	 	for(int i=0;i<n;i++) 	{ 		printf("%ld\t%s\t%s\t%d\t%4.1f\n",stus->num,stus->name,stus->sex,stus->age,stus->score); 		stus=stus->next; 	} } void insert(struct student *stu)/* head 代表头指针，stu代表要插入的节点*/ {	 	struct student *p0,*p1,*p2; 	p0=stu; 	 	if(head==NULL) 	{ 		p1=p2=head=p0; 		p0->next=NULL; 	} 	else 	{ 		p1=p2=head; 		if(p0->num<p1->num) 		{ 			head=p0; 			p0->next=p1; 		} 		else 		{ 			while((p0->num>p1->num)&&(p1->next!=NULL)) 			{ 				//p2记录上一个节点的指针 				p2=p1; 				p1=p1->next; 			}	 			if(p0->num>p2->num && p0->num<p1->num) 			{ 				p2->next=p0; 				p0->next=p1; 			} 			else if(p0->num>p1->num) 			{ 				p2->next=p0; 				p0->next=NULL; 			} 			else 			{ 				printf("data error!!!"); 			} 		} 	} } void writeToFile() { 	struct student *stus; 	stus=head; 	FILE *fp; 	fp=fopen("C:\\Users\\zcq\\Desktop\\file.txt","wb"); 	if(fp!=NULL) 	{ 		for(int i=0;i<n;i++) 		{ 			fwrite(stus,SIZE,1,fp); 			 			stus=stus->next; 		} 		fclose(fp); 	} 	 } void addOne() { 	struct student *p1,*p2; //p1p2一个用来指向新创建的节点，一个用来指向上一个节点 	//n在这里表示起始节点的个数 	p1=p2=(struct student *) malloc(SIZE); //开辟一个新单元，返回一个void指针(强制转换)，让p1p2都指向这个内存区域的首地址 	printf("请输入学生学号，姓名，性别，年龄，成绩，用空格键隔开:\n"); 	scanf("%ld %s %s %d %f",&p1->num,&p1->name,&p1->sex,&p1->age,&p1->score);  //输入使p1指向他s 	head= NULL; 	int flag; 	while(1) 	{ 		insert(p1); 		n++; 		printf("添加成功，可按0退出或其他数字键继续\n"); 		scanf("%d",&flag); 		if(!flag) break; 		p1=(struct student *)malloc(SIZE); 		printf("请输入学生学号，姓名，性别，年龄，成绩，用空格键隔开:\n"); 		scanf("%ld %s %s %d %f",&p1->num,&p1->name,&p1->sex,&p1->age,&p1->score);  	} 	//结束后将p2指向NULL 	writeToFile(); }  void deleteOne() { 	long num=0; 	printf("请输入您要删除的学生的学号：\n"); 	scanf("%ld",&num); 	struct student *p1,*p2; 	p1=p2=head; 	if(head->num==num) 	{ 		head=p1->next; 	}else 	{ 		while(p1->num !=num && p1->next!=NULL) 		{ 			p2=p1; 			p1=p1->next; 		} 		if(p1->num==num) 		{ 			p2->next=p1->next; 			n=n-1; 		} 		else 		{ 			printf("NO.%ld is not found!!",num); 		} 	} 	writeToFile(); } void selectOne() { 	long num; 	struct student *stu; 	stu=head; 	printf("请输入您要查询的学生号,按Enter键确定\n"); 	scanf("%ld",&num); 	char ch[6]; 	char flu; 	for(int i=0;i<n;i++) 	{ 		if(stu->num!=num && stu->next!=NULL) 		{ 			stu=stu->next; 		} 		if(stu->num==num) 		{ 			printf("%ld\t%s\t%s\t%d\t%4.1f\n",stu->num,stu->name,stu->sex,stu->age,stu->score); 			break; 		} 		if(stu==last) 		{ 			printf("此学号不存在，请按1重新输入或按其他键退出"); 			scanf("%s",ch); 			scanf("%*c",&flu); 			if(!strcmp(ch,"1")) 			{ 				selectOne(); 			} 		} 	} }  void exit() { 	exit(1); } int filelen(char *pFilePath) { 	FILE *pFile = fopen( pFilePath, "r" );    char ch;    int num = 0;    while ( ch = getc( pFile ) != EOF )    {           num++ ;    }    fclose( pFile );    return num; } void main() { 	//刚启动则建立一个链表，读取文件中的信息 	FILE *fp; 	char fileName[50]="C:\\Users\\zcq\\Desktop\\file.txt"; 	struct student *p1,*p2; 	fp=fopen(fileName,"rb"); 	if(fp==NULL) {printf("数据文件读取失败"); exit(0);} 	if(fp!=NULL) 	{ 		//TODO: 		if(filelen(fileName)!=0) 		{ 			while(feof(fp)==0) 			{	 				if(!n) 				{ 					head=p1=p2=(struct student *)malloc(SIZE); 					fread(p1,SIZE,1,fp); 					stucpy(head,p1); 					last=p1; 					p1->next=NULL; 					n++; 				} 				else 				{ 					p1=p2=(struct student *)malloc(SIZE); 					fread(p2,SIZE,1,fp); 					stucpy(p1,p2); 					last->next=p1; 					p1->next=NULL; 					last=p1; 					n++; 				} 			} 		} 		 		printf("%d",n); 	} 	screen(); } void screen() { 	int choice=0; 	while(1) 	{ 		printf("\n\n\n\n\n"); 		printf("***********************Welcome to the student info system***********************\n"); 		printf("************************1.显示所有学生信息**************************************\n"); 		printf("************************2.查询各人信息******************************************\n"); 		printf("************************3.添加学生信息******************************************\n"); 		printf("************************4.删除学生信息******************************************\n"); 		printf("************************5.退出**************************************************\n"); 		printf("*******************请输入选项，按Enter键确认....********************************\n"); 		scanf("%d",&choice); 		switch(choice) 		{ 		case 1: 			selectAll(); 			break; 		case 2: 			selectOne(); 			break; 		case 3: 			addOne(); 			break; 		case 4: 			deleteOne(); 			break; 		case 5: 			exit(); 			break; 		default : 			break; 		} 	} }

user: user-2
content: 读之前将你存储数据的内存memset了。

user: user-3
content: 贴一下代码好不。