Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.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/4/c/67.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中从文件中删除记录(保存的记录是struct)_C++_C_Io - Fatal编程技术网

C++ 如何在c中从文件中删除记录(保存的记录是struct)

C++ 如何在c中从文件中删除记录(保存的记录是struct),c++,c,io,C++,C,Io,我有一个程序来列出学生,它可以添加一个新的,搜索,甚至从名单中删除学生的学生编号,它包含一个学生信息结构。所有的信息都在一个名为REG.DAT的文件中。我的问题在于>>删除通常的方法是 将已删除的bool成员添加到struct student 删除学生时,使用设置is_deleted将结构更新为true 阅读学生记录时,忽略已删除的记录 提供一个过程,可以逐个记录读取整个文件记录,并将其复制到另一个文件,跳过已删除的记录。然后将另一个文件重命名为原始名称。定期调用此过程,或在程序启动时调用,或

我有一个程序来列出学生,它可以添加一个新的,搜索,甚至从名单中删除学生的学生编号,它包含一个学生信息结构。所有的信息都在一个名为REG.DAT的文件中。我的问题在于>>删除通常的方法是

  • 将已删除的
    bool
    成员添加到
    struct student
  • 删除学生时,使用设置
    is_deleted
    将结构更新为true
  • 阅读学生记录时,忽略已删除的记录
  • 提供一个过程,可以逐个记录读取整个文件记录,并将其复制到另一个文件,跳过已删除的记录。然后将另一个文件重命名为原始名称。定期调用此过程,或在程序启动时调用,或仅在需要时手动调用

    • 通常的方法是

      • 将已删除的
        bool
        成员添加到
        struct student
      • 删除学生时,使用设置
        is_deleted
        将结构更新为true
      • 阅读学生记录时,忽略已删除的记录
      • 提供一个过程,可以逐个记录读取整个文件记录,并将其复制到另一个文件,跳过已删除的记录。然后将另一个文件重命名为原始名称。定期调用此过程,或在程序启动时调用,或仅在需要时手动调用

      对于重叠的内存部分,不应使用
      memcpy
      。你应该改用。正如memmov的描述所述:

      移动内存块 将num bytes的值从源指向的位置复制到目标指向的内存块。复制就像使用了中间缓冲区一样进行,允许目标和源重叠。

      另外:
      -找到学生号后,可以使用
      break
      语句停止对第一个循环的迭代

      亲切的问候,

      Bo

      对于重叠的内存部分,不应使用
      memcpy
      。你应该改用。正如memmov的描述所述:

      移动内存块 将num bytes的值从源指向的位置复制到目标指向的内存块。复制就像使用了中间缓冲区一样进行,允许目标和源重叠。

      另外:
      -找到学生号后,可以使用
      break
      语句停止对第一个循环的迭代

      亲切的问候,
      Bo

      这不一定是通常的做法,有基于日志的方法(仅追加),但编写新文件并对其进行原子化重命名的想法肯定比修改当前的权威文件要好。这不一定是通常的做法,有基于日志的方法(仅追加)但是,编写一个新文件并对其进行原子化重命名的想法肯定比修改现有的权威文件要好。
      void _remove()
      {
          int std_num = 0 , k ;
          int status = 1 , i = -1 , j = 0  ; 
          struct students read[100] ,temp;
          FILE *p ;
      
          p = fopen("reg.dat","rb");
          if(!p)
          {
              system("cls");
              cout << ">>>>>Register file could not be opened! call the support .<<<<<" << endl;
              _menu();
          }
          while(!feof(p))
          {
              fread(&read[i],sizeof(struct students),1,p) ;
              i++;
          }
          cout << "Enter STD NO. to delete from the list : " << endl ;
          cin >> std_num ;
          for( j = 0 ; j < i ; j++)
          {
              if(std_num == read[j].std_num)
              {
                  for( k = j + 1 ; k < i ; k++)
                  {
                      memcpy(&read[k-1] , &read[k],sizeof (students));
                  }
              }
          }
          fclose(p);
      
          FILE *fp;
          fp = fopen("reg.dat","wb"); 
          for( int l = 0 ; l < i - 2 ; l++)
              fwrite(&read[l], sizeof(struct students), 1 ,fp );
          fclose(fp);
          system("cls") ;
          cout << "STD with NO. " << std_num << " has been removed" << endl ; 
          _menu();
      }