Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何从此文件中删除此条目?_C_File_Record_Procedural Programming - Fatal编程技术网

C 如何从此文件中删除此条目?

C 如何从此文件中删除此条目?,c,file,record,procedural-programming,C,File,Record,Procedural Programming,-此函数负责通过检查文件中的帐户号是否存在来删除文件中存在的预期条目。这里存在两个文件,第一个文件名为“记录”,包含原始数据,第二个文件名为“新”,其中“记录”的数据将复制到其中,从代码中可以看出,如果账号不存在,数据将从“记录”复制到“新”,并将重命名为“记录”,如果存在,记录将被删除,因此两个文件将被关闭,“记录”文件将被删除 -我不理解的是条目是如何被删除的,在else语句中,数据没有被复制到“new”文件,之后“record”文件被删除。在我看来,“新”应该是“无效”的,但它包含剩余的记

-此函数负责通过检查文件中的帐户号是否存在来删除文件中存在的预期条目。这里存在两个文件,第一个文件名为“记录”,包含原始数据,第二个文件名为“新”,其中“记录”的数据将复制到其中,从代码中可以看出,如果账号不存在,数据将从“记录”复制到“新”,并将重命名为“记录”,如果存在,记录将被删除,因此两个文件将被关闭,“记录”文件将被删除

-我不理解的是条目是如何被删除的,在else语句中,数据没有被复制到“new”文件,之后“record”文件被删除。在我看来,“新”应该是“无效”的,但它包含剩余的记录,并且预期的条目已被删除

-条目是如何被删除的?

-如何将数据复制到将重命名为“记录”的“新”记录,而不在else语句中打印它?

#注意:
-结构变量“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你解释我在找什么,现在我找到了;)