如何用c语言实现删除文件中指定的数据;例如
#include<stdio.h>#include<string.h>#include<conio.h>#definenumbook2#definenumvip2stru...
#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 的数据该怎样做?
求大侠帮忙! 十万火急! 这是我的全部家当,以后补上! 展开
#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、删除文件部分内容的大概步骤:新建一个临时文件,把原文件内容向临时文件里拷贝,遇到要删除的内容就跳过。结束后关闭文件,用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;
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用fseek函数定义流指针位置,位置需要自己计算。利用offset。然后再写入新内容覆盖旧内容。但这么做有缺陷,新内容必须和就内容一样长,否则覆盖不完全或把后面的内容也覆盖。
所以,我建议直接新建新文件写入完整的新数据,更简单。
fseek()用来移动文件流的读写位置.
1、参数stream 为已打开的文件指针,
2、参数offset 为根据参数whence 来移动读写位置的位移数。参数 whence 为下列其中一种:
SEEK_SET 从距文件开头offset 位移量为新的读写位置. SEEK_CUR 以目前的读写位置往后增加offset 个位移量.
SEEK_END 将读写位置指向文件尾后再增加offset 个位移量. 当whence 值为SEEK_CUR 或
SEEK_END 时, 参数offset 允许负值的出现.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的描述不清晰,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);
/* 释放分配的内存,实现略 */
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询