运用C语言如何删除文件中的某条数据

求大神!!
学生管理系统的删除功能,如何实现。
我这函数怎么不能删除之前录入的学生数据呢

头文件和全局变量:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
struct student
{
char num[20];
char name[20];
char shuxue[20];
char yingyu[20];
char wuli[20];
char jisuanji[20];
};
FILE *fp;
struct student stu[10000],stu2[10];
char wenjianming[20];
int i,k,flag2=0,c=0,m=0,n=0,x=0;
int j=0;//学生个数!
int b=0;//追加学生个数!!
int s=0;//删除学生个数!!
int sum=0;//总的学生个数!!
int flag=0;
函数:
nt shanchu()
{
sum=n+m-s;
if(sum==0)
{
printf("您得先录入,再删除~!笨!~\n");

getchar();
return 0;

}
char xuehao[20];
printf("请输入你要打开的文件名");
scanf("%s",&wenjianming);
if((fp=fopen(wenjianming,"rb+"))==NULL)
{
puts("the file can't be opened");
c++;
return 1;
}

printf("请输入要删除的人的学号:");

scanf("%s",xuehao);

for(i=0;i<sum;i++)
{
if(strcmp(stu[i].num,xuehao)==0)
{
printf("%s %s %s %s %s %s\n",stu[i].num,stu[i].name,stu[i].shuxue,stu[i].yingyu,stu[i].wuli,stu[i].jisuanji);

for(k=i;k<sum-1;k++)
{

strcpy(stu[k].num,stu[k+1].num );
strcpy(stu[k].name ,stu[k+1].name );

strcpy(stu[k].shuxue ,stu[k+1].shuxue );
strcpy(stu[k].wuli,stu[k+1].wuli );

strcpy(stu[k].yingyu,stu[k+1].yingyu );
strcpy(stu[k].jisuanji,stu[k+1].jisuanji );

}
break;
}

}
fclose(fp);
s++;

printf("删除后的数据:\n");

for(i=0;i<sum-s;i++)
{

printf("%s %s %s %s %s %s\n",stu[i].num,stu[i].name,stu[i].shuxue,stu[i].yingyu,stu[i].wuli,stu[i].jisuanji);
fprintf(fp,"%s %s %s %s %s %s\n",stu[i].num,stu[i].name,stu[i].shuxue,stu[i].yingyu,stu[i].wuli,stu[i].jisuanji);
}

fclose(fp);
printf("删除成功!\n");
return 0;

第1个回答  推荐于2016-02-20
比如
#include <stdio.h>
#include <stdlib.h>

int main()
{
FILE *fp;
char *insert = "EE,EE,EE,", tmp[256]={0};
int pos, i;

/*test.txt文件内容:01,00,00,00,0E,00,00,00,00,00,00,E1,E2,00,00,00,00*/
fp = fopen("test.txt", "r+");

/*1、等长覆盖*/
fseek(fp, 12, 1);
fprintf(fp, "0F"); /*直接写入等长度的数据就可以完成覆盖*/

/*2、E2后插入“EE,EE,EE,” */
fseek(fp, 25, 1);
pos = ftell(fp); /*插入位置*/
fgets(tmp, 256, fp); /*把后面的数据缓存*/
fseek(fp, pos, 0); /*移动到插入位置*/
fprintf(fp, insert); /*插入,就是写入数据*/
fprintf(fp, tmp); /*把原来的数据再写回来, 完成*/

/*3、01读取后++两次,并重新写回文件*/
rewind(fp);
fscanf(fp, "%x", &i); /*读取数据*/
i = i+2; /* +2 */
fseek(fp, -2, 1); /*调整指针*/
fprintf(fp, "%02x", i); /*写文件*/

fclose(fp);
system("PAUSE");
return 0;
}
第2个回答  推荐于2016-11-30

你在fprintf之前已经关闭文件了,应该用写模式打开文件。

fp = fopen( wenjianming, "wb+" )

追问

这样就可以了?

追答

最后一个for循环前面那个fclose(fp)什么意思。
还要他们说的
scanf("%s",wenjianming);
改了先试试看吧

本回答被提问者采纳
第3个回答  2013-12-10
这句话明显错误:scanf("%s",&wenjianming);

wenjianming变量本身就是地址,不需要取地址的。追问

那要怎么改呀,把&去掉就可以了?

第4个回答  2013-12-10
私信我把。。。这尼玛这么一坨。。。
相似回答