C++ 如何更改存储在c+中文件中的特定记录的特定实体+;

C++ 如何更改存储在c+中文件中的特定记录的特定实体+;,c++,C++,嗨,朋友们,我想修改存储在文件中的特定记录的特定实体。就像我将记录存储在文件中一样 第35卷 姓名:阿德南·伊尔沙德 状况:不被接纳 第40卷 姓名:阿德尔·艾哈迈德 状况:不被接纳 第30卷 姓名:阿里什 阿德南:不允许 第35卷 姓名:单 状况:不被接纳 在这里,我想通过roll no搜索记录,并将该记录的状态更改为与我输入的相同 30滚动“否”以搜索记录,然后程序搜索该记录并将其状态更改为“已接纳”。 我已经这样做了,但是我的代码只改变了一条记录,当我对另一条记录这样做时,什么也没有发生。

嗨,朋友们,我想修改存储在文件中的特定记录的特定实体。就像我将记录存储在文件中一样

第35卷

姓名:阿德南·伊尔沙德

状况:不被接纳

第40卷

姓名:阿德尔·艾哈迈德

状况:不被接纳

第30卷

姓名:阿里什

阿德南:不允许

第35卷

姓名:单

状况:不被接纳

在这里,我想通过roll no搜索记录,并将该记录的状态更改为与我输入的相同 30滚动“否”以搜索记录,然后程序搜索该记录并将其状态更改为“已接纳”。 我已经这样做了,但是我的代码只改变了一条记录,当我对另一条记录这样做时,什么也没有发生。 代码在这里

    char stat[13];

    cout<<"Enter Registration No";

    cin>>reg_no;

    fstream out("Intermediate.txt",ios::in|ios::out|ios::ate|ios::app);

    out.seekg(0,ios::beg);

    out.read((char*)&std,sizeof(std));

    while(!out.eof())

     {  

        record_no++;

        if(strcmp(std.get_reg_no(),reg_no)==0)

        {

            found=1;

            break;

        }

     }

    location=(record_no-1)*sizeof(std);

    out.seekp(location,ios::beg);

    char new_status[]="Addmitted"; // initialized to replace with status

    strcpy(std.status,new_status);

    out.write((char*)&std,sizeof(std));

    out.close();
charstat[13];
coutreg_no;
fstream out(“Intermediate.txt”,ios::in | ios::out | ios::ate | ios::app);
out.seekg(0,ios::beg);
读出((字符*)和标准,尺寸(标准));
而(!out.eof())
{  
记录_no++;
if(strcmp(标准get_reg_no(),reg_no)=0)
{
发现=1;
打破
}
}
位置=(记录编号1)*尺寸(标准);
out.seekp(位置,ios::beg);
char new_status[]=“Addmitted”//初始化为替换为状态
strcpy(标准状态、新状态);
out.write((字符*)和std,sizeof(std));
out.close();
要修改文本文件:

  • 将文件加载到内存中(例如
    std::vector
  • 修改内存中的数据
  • 将内存写入文件
  • 您正在犯一些重大错误,这些错误使您付出了代价:

    • 不要使用
      goto
      ;有更好的方法(子功能)
    • 不要在EOF上循环
    • 使用
      std::string
      代替
      char*
    • 模块化,模块化,模块化
    最后一点需要一些额外的帮助:一次只做一件事。您的主代码应该如下所示:

    get user input (filename, item to modify, etc)
    
    std::vector<items> items = load_file( filename );
    auto item = std::find( items.begin(), items.end(), my_search_criterion_predicate );
    if (item != items.end())
    {
      modify item;
    }
    write_file( items );
    
    user output
    
    获取用户输入(文件名、要修改的项目等)
    std::vector items=load_文件(文件名);
    auto item=std::find(items.begin()、items.end()、my\u search\u criteria\u predicate);
    if(item!=items.end())
    {
    修改项目;
    }
    写入_文件(项目);
    用户输出
    

    所有这些都需要您稍加学习,但值得付出努力。

    您的代码看起来很凌乱。使用
    goto
    会引发潜在的危险,因为代码流可能在运行时被挂起。我们甚至看不到
    凭证
    标签在哪里。在哪里可以找到将
    更新为
    0
    ?它有什么初始化值?另外,您可能只发布可能存在无法解决的问题的代码片段。不是来自
    main
    的完整代码很难理解。此代码是一个长项目的一部分,这就是为什么它看起来很凌乱的原因。初始化值将被替换为我们要修改的值,表示状态“不允许”将更改为“允许”“通过该初始化值。
    goto
    肯定会引起一些标志。我忍不住要链接一个关于
    goto
    charstat[13]的非常好的漫画;coutreg_no;fstream out(“Intermediate.txt”,ios::in | ios::out | ios::ate | ios::app);out.seekg(0,ios::beg);读出((字符*)和标准,尺寸(标准));而(!out.eof()){record_no++;if(strcmp(std.get_reg_no(),reg_no)==0){found=1;break;}}}location=(record_no-1)*sizeof(std);out.seekp(位置,ios::beg);char new_status[]=“Addmitted”;strcpy(标准状态、新状态);out.write((字符*)和std,sizeof(std));out.close();