如何用c语言实现删除文件中指定的数据;例如

#include<stdio.h>
#include<string.h>
#include<conio.h>
#define numbook 2
#define numvip 2
struct book
{
char title[20]; //书名
char author[20]; //作者名
char number[10]; //书的编号
char datetime[10]; //出版时间
char sort[10]; //书的分类
int price; //书的价格
struct book *next;
}A1[numbook],A2[numbook],*p;
struct vip //定义会员
{
char name[20]; // 会员姓名
int piont; //会员积分

struct vip *next; //定义结构体指针,指向下一个结点
}B1[numvip],B2[numvip];
如果要删除 B[2].name 和 B[2].piont 的数据该怎样做?
求大侠帮忙! 十万火急! 这是我的全部家当,以后补上!

1、首先我们输入【deleteScore】函数,先看整体代码,再一一解释。

2、在接下来我们输入永久循环语句。

3、再接下来,我们选择操作删除的方式。

4、再接下来我们就可以调用删除的函数了。

注意事项:

C语言提供了许多低级处理的功能,并仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-02-27

1、删除文件部分内容的大概步骤:新建一个临时文件,把原文件内容向临时文件里拷贝,遇到要删除的内容就跳过。结束后关闭文件,用remove("原文件名");把原文件删除,用rename("临时文件名","原文件名");把临时文件名改为原文件名。


2、例如在原文件123.txt中删除以2和以4编号开头的行,可用以下代码实现:

#include "stdio.h"
#include "stdlib.h"
int main(void){
    FILE *fin,*ftp;
    char a[1000];
    fin=fopen("123.txt","r");//读打开原文件123.txt
    ftp=fopen("tmp.txt","w");//写打开临时文件tmp.txt
    if(fin==NULL || ftp==NULL){
        printf("Open the file failure...\n");
        exit(0);
    }
    while(fgets(a,1000,fin))//从原文件读取一行
        if(a[0]!='2' && a[0]!='4')//检验是要删除的行吗?
            fputs(a,ftp);//不是则将这一行写入临时文件tmp.txt
    fclose(fin);
    fclose(ftp);
    remove("123.txt");//删除原文件
    rename("tmp.txt","123.txt");//将临时文件名改为原文件名
    return 0;
}

本回答被网友采纳
第2个回答  2018-06-21

用fseek函数定义流指针位置,位置需要自己计算。利用offset。然后再写入新内容覆盖旧内容。但这么做有缺陷,新内容必须和就内容一样长,否则覆盖不完全或把后面的内容也覆盖。

所以,我建议直接新建新文件写入完整的新数据,更简单。

fseek()用来移动文件流的读写位置.

1、参数stream 为已打开的文件指针,
2、参数offset 为根据参数whence 来移动读写位置的位移数。参数 whence 为下列其中一种:
SEEK_SET 从距文件开头offset 位移量为新的读写位置. SEEK_CUR 以目前的读写位置往后增加offset 个位移量.
SEEK_END 将读写位置指向文件尾后再增加offset 个位移量. 当whence 值为SEEK_CUR 或
SEEK_END 时, 参数offset 允许负值的出现.

第3个回答  推荐于2017-11-25
你的描述不清晰,B1和B2两个结构数组,到底要删除哪个?B[2]是肯定不对的,这两个数组的长度都是2,下标只能是0和1,即B1[0], B1[1], B2[0], B2[1]。
你还是先把问题说清楚了,这个程序不难写。追问

不好意思漏掉了! 是要删除B2[1].name 和 B2[1].point
麻烦大侠指教!

追答

还不是很清楚,文件里存了哪几条数据?数据在B1和B2里是如何存放的。以B2为例,B2[0]或B2[1],每个里存放一条数据还是用链表串起来的多条数据?
我按如下的假设实现:
文件中vip的数据以文本方式存储(假设文件名为vip.txt),每一条数据存一个会员姓名和会员积分信息,用空格分给,每条记录结束是一个回车符。数据读取出来之后放入B2[1]为头的链表中,然后将B2[1]代表的数据删除(即第一条记录),把其余部分的数据重新写入到文件中。
前面的定义略

main()
{
FILE *fp;
struct vip *ptr, buf;

fp = fopen("vip.txt", "r");
if(fp == NULL) {
printf("Can not open file vip.txt\n");
exit(-1);
}

ptr = NULL;
/* 读取vip.txt中的数据,存放在B2[1]为头的链表中 */
while(fscanf(fp, "%s %d", buf.name, &buf.point) != EOF) {
if(ptr = NULL)
ptr = &B2[1];
else {
ptr->next = (struct vip *)malloc(sizeof(struct vip));
ptr = ptr->next;
}
strcpy(ptr->name, buf.name);
ptr->point= buf.point;
ptr->next = NULL;
}
fclose(fp);

/* 将文件中的内容显示在屏幕上 */
ptr = &B2[1];
while(ptr) {
printf("%s %d\n", ptr->name, ptr->point);
ptr = ptr->next;
}

/* 删除B2[1]的内容 */
fp = fopen("vip.txt", "w"));
if(fp == NULL) {
printf("Can not write file vip.txt\n");
/* 释放列表中分配的内存空间,很简单,实现略 */
exit(-2);
}

/* 删除第一条记录,用第二条记录的值代替第一条 */
ptr = B2[1]->next;
if(ptr != NULL) {
strcpy(B2[1].name, ptr->name);
B2[1].point = ptr->point;
B2[1].next = ptr->next;
free(ptr);
}

/* 将新的链表保存到文件中 */
ptr = &B2[1];
while(ptr) {
fprintf(fp, "%s %d\n", ptr->name, ptr->point);
ptr = ptr->next;
}
fclose(fp);
/* 释放分配的内存,实现略 */
}

本回答被提问者采纳
相似回答