📜  C ++程序修改二进制文件的内容

📅  最后修改于: 2021-06-01 01:18:25             🧑  作者: Mango

本文介绍了如何修改二进制文件的内容。

给定一个包含学生记录的二进制文件,任务是修改或更改指定学生的记录。如果没有这样的学生的记录,则打印“找不到记录”。

例子:

Input:
old roll no: 1
new roll no: 11
new name: "Geek"
Output:
roll no: 11
name: "Geek"
record successfully modified

Input:
old roll no: 234
new roll no: 14
new name: "Geek2"
Output:
record not found

在此示例中,将从用户那里获取要修改其记录的学生的现有卷号,并创建一个新更新的记录来替换先前的记录。

方法:

  • 步骤1:在二进制文件中搜索卷号。
  • 步骤2:在文件中搜索时,变量“ pos”存储文件指针记录的位置,然后遍历(继续)读取记录。
  • 步骤3:如果要搜索的卷号存在,则将写指针(指向前一条记录的末尾)放置在pos处。
  • 步骤4:调用getdata函数获取新记录。
  • 步骤5:将新对象写入位置“ pos”,因此记录被更新,并打印“记录已成功更新”。
  • 步骤6:如果卷号不存在,则打印“找不到记录”。

使用的标准库函数:

// tells the position of read pointer 
file.tellg();

// places the writing pointer at 
// position "pos" in the file
file.seekp(pos);

下面是上述方法的实现:

// C++ program to modify the content
// of a binary file
  
#include 
using namespace std;
  
class abc {
    int roll;
    char name[20];
  
public:
    void getdata(int, char[]);
    void update(int, int, char[]);
    void testcase1();
    void testcase2();
    void putdata();
};
  
// Code to display the data of the
// data of the object
void abc::putdata()
{
    cout << "roll no: ";
    cout << roll;
    cout << "\nname: ";
    cout << name;
}
  
// Code to set the value to the object
void abc::getdata(int a, char str[])
{
    // setting the new roll no
    roll = a;
  
    // setting new name
    strcpy(name, str);
}
  
void abc::update(int rno, int r, char str[])
{
    // code to update and modify
    // the content of the binary file
    int pos, flag = 0;
  
    // rno=9
    fstream fs;
    fs.open("he.dat",
            ios::in | ios::binary | ios::out);
  
    while (!fs.eof()) {
        // storing the position of
        // current file pointeri.e. at
        // the end of previously read record
        pos = fs.tellg();
  
        fs.read((char*)this, sizeof(abc));
        if (fs) {
  
            // comparing the roll no with that
            // of the entered roll number
            if (rno == roll) {
                flag = 1;
  
                // setting the new (modified )
                // data of the object or new record
                getdata(r, str);
  
                // placing the put(writing) pointer
                // at the starting of the  record
                fs.seekp(pos);
  
                // writing the object to the file
                fs.write((char*)this, sizeof(abc));
  
                // display the data
                putdata();
                break;
            }
        }
    }
    fs.close();
  
    if (flag == 1)
        cout << "\nrecord successfully modified \n";
    else
        cout << "\nrecord not found \n";
}
  
// Sample input 1
void abc::testcase1()
{
    int rno, r;
    char name[20];
  
    // roll no to be searched
    rno = 1;
  
    // new roll no
    r = 11;
  
    // new name
    strcpy(name, "Geek");
  
    // call update function with new values
    update(rno, r, name);
}
  
// Sample input 2
void abc::testcase2()
{
    int rno, r;
    char name[20];
  
    // roll no to be searched
    rno = 4;
  
    // new roll no
    r = 14;
  
    // new name
    strcpy(name, "Geek2");
  
    // call update function with the new values
    update(rno, r, name);
}
  
// Driver code
int main()
{
    abc s;
  
    // sample case 1
    s.testcase1();
  
    // sample case 2
    s.testcase2();
  
    return 0;
}

输出:

想要从精选的最佳视频中学习并解决问题,请查看有关从基础到高级C++的C++基础课程以及有关语言和STL的C++ STL课程。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”