C 如何从此文件中删除此条目?
-此函数负责通过检查文件中的帐户号是否存在来删除文件中存在的预期条目。这里存在两个文件,第一个文件名为“记录”,包含原始数据,第二个文件名为“新”,其中“记录”的数据将复制到其中,从代码中可以看出,如果账号不存在,数据将从“记录”复制到“新”,并将重命名为“记录”,如果存在,记录将被删除,因此两个文件将被关闭,“记录”文件将被删除 -我不理解的是条目是如何被删除的,在else语句中,数据没有被复制到“new”文件,之后“record”文件被删除。在我看来,“新”应该是“无效”的,但它包含剩余的记录,并且预期的条目已被删除 -条目是如何被删除的? -如何将数据复制到将重命名为“记录”的“新”记录,而不在else语句中打印它? #注意:C 如何从此文件中删除此条目?,c,file,record,procedural-programming,C,File,Record,Procedural Programming,-此函数负责通过检查文件中的帐户号是否存在来删除文件中存在的预期条目。这里存在两个文件,第一个文件名为“记录”,包含原始数据,第二个文件名为“新”,其中“记录”的数据将复制到其中,从代码中可以看出,如果账号不存在,数据将从“记录”复制到“新”,并将重命名为“记录”,如果存在,记录将被删除,因此两个文件将被关闭,“记录”文件将被删除 -我不理解的是条目是如何被删除的,在else语句中,数据没有被复制到“new”文件,之后“record”文件被删除。在我看来,“新”应该是“无效”的,但它包含剩余的记
-结构变量“add”用于另一个存储条目帐号的函数
struct data
{
int acc_no;
char name[30];
int age;
} add,rem;
void erase(void)
{
FILE *old,*newrec;
old=fopen("record.txt","r");
newrec=fopen("new.txt","w");
printf("Enter the account no. of the customer you want to delete:");
scanf("%d",&rem.acc_no);
while (fscanf(old,"%d %s %d",&add.acc_no,add.name,&add.age)!=EOF)
{
if(add.acc_no != rem.acc_no)
{
fprintf(newrec,"%d %s %d",add.acc_no,add.name,add.age);
}
else
{
printf("\nRecord deleted successfully!\n");
}
}
fclose(old);
fclose(newrec);
remove("record.txt");
rename("new.txt","record.txt");`
它只需将所有记录(要删除的记录除外)从
record.txt
复制到new.txt
然后删除旧的
record.txt
,并将new.txt
重命名为record.txt奇怪的fprintf(newrec,“%d%s%d”,add.acc\u no,add.name,add.age)代码>应该有一个换行符,格式为字符串或age,acc_no将被合并(fscanf(旧,“%d%s%d”,&add.acc_no,add.name,&add.age)!=EOF)
如果输入与预期格式不匹配,则容易出现无限循环。@AndrewHenle当达到EOF时,while循环将结束。@如果fscanf()
无法转换任何字段,将返回0
,再也不要读了——它会不断地重试,一遍又一遍地读不到相同的数据。我理解这个过程,但它是如何在else语句中没有提到的地方复制数据的?我不确定我是否理解你的问题。如果记录编号是要删除的编号,则不会执行将记录复制到另一个文件中的fprintf
。@JhonathanMartini我也不确定您到底不明白什么,但是。。。如果你有一堆杂志,想摆脱第23期,你可以把它们一个接一个地移到新的一堆。当你到了23号时,你不需要把它放在新的一堆里,而是要做些别的事情(把它放在另一堆里,扔进垃圾桶),然后再拿下一堆。然而,数据与杂志不同。如果您没有将它写在某个地方(通过调用fprintf
),您可以将它留在原来的位置(在添加
结构中)。。。当你翻阅下一条记录时,它将被覆盖。谢谢@TripeHound你解释我在找什么,现在我找到了;)