This article explains how to modify the content of a Binary File.
Given a binary file that contains the records of students, the task is to modify or alter the record of the specified student. If the record of no such student exists, then print “record not found”.
Examples:
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
In this example, the existing roll number of the student whose record is to be modified is taken from the user and a newly updated record is created that replaces the previous record.
Approach:
- Step 1: Searching for the roll number in the binary file.
- Step 2: While searching in the file, the variable “pos” stores the position of file pointer record then traverse(continue) reading of the record.
- Step 3: If the roll number to be searched exists then place the write pointer (to ending of the previous record) i.e. at pos.
- Step 4: Call getdata function to take the new record.
- Step 5: Write the new object at the position “pos” and hence the record is updated and print “record successfully updated”.
- Step 6: If the roll number does not exists then print “record not found”.
Standard Library Functions used:
// tells the position of read pointer
file.tellg();
// places the writing pointer at
// position "pos" in the file
file.seekp(pos);
Below is the implementation of the above approach:
#include <bits/stdc++.h>
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();
};
void abc::putdata()
{
cout << "roll no: " ;
cout << roll;
cout << "\nname: " ;
cout << name;
}
void abc::getdata( int a, char str[])
{
roll = a;
strcpy (name, str);
}
void abc::update( int rno, int r, char str[])
{
int pos, flag = 0;
fstream fs;
fs.open( "he.dat" ,
ios::in | ios::binary | ios::out);
while (!fs.eof()) {
pos = fs.tellg();
fs.read(( char *) this , sizeof (abc));
if (fs) {
if (rno == roll) {
flag = 1;
getdata(r, str);
fs.seekp(pos);
fs.write(( char *) this , sizeof (abc));
putdata();
break ;
}
}
}
fs.close();
if (flag == 1)
cout << "\nrecord successfully modified \n" ;
else
cout << "\nrecord not found \n" ;
}
void abc::testcase1()
{
int rno, r;
char name[20];
rno = 1;
r = 11;
strcpy (name, "Geek" );
update(rno, r, name);
}
void abc::testcase2()
{
int rno, r;
char name[20];
rno = 4;
r = 14;
strcpy (name, "Geek2" );
update(rno, r, name);
}
int main()
{
abc s;
s.testcase1();
s.testcase2();
return 0;
}
|
Output:
