Sunteți pe pagina 1din 41

Data File Handling in C++

Introduction
Computer programs are associated to work with files as it helps in storing data & information permanently. File - itself a bunch of bytes stored on some storage devices. In C++ this is achieved through a component header file called fstream.h The I/O library manages two aspects- as interface and for transfer of data. The library predefine a set of operations for all file related handling through certain classes.

C++ provides a new technique for handling I/O operations through mechanism known as streams. A stream refers to a flow of data. Classified in 2 categories: 1. Output stream 2. Input stream In output stream flow of data is from program to the output device. In input stream the flow of data is from input device to a program in main memory.

The fstream.h header file


Streams act as an interface between files and programs. They represent as a sequence of bytes and deals with the flow of data. Every stream is associated with a class having member functions and operations for a particular kind of data flow. File Program ( Input stream) - reads Program File (Output stream) write All designed into fstream.h and hence needs to be included in all file handling programs. Diagrammatically as shown in next slide

Stream Class Hierarchy


ios istream iostream User-Defined ofstream Streams System-Defined Streams ostream

ifstream

fstream

Why to use Files:


Convenient way to deal large quantities of data. Store data permanently (until file is deleted). Avoid typing data into program multiple times. Share data between programs. We need to know: how to "connect" file to program how to tell the program to read data how to tell the program to write data error checking and handling EOF

Stream Insertion Operators

Are defined in the ostream class The operator << is called the inserter Stream Extraction Operators Are defined in the istream class and are used to receive data from the input device The operator >>, called the extractor, accepts any built-in data type passed as arguments

1: To access file handling routines: #include <fstream.h> 2: To declare variables that can be used to access file: ifstream in_stream; ofstream out_stream; 3: To connect your program's variable (its internal name) to an external file (i.e., on the Unix file system): in_stream.open("infile.dat"); out_stream.open("outfile.dat"); 4: To see if the file opened successfully: if (in_stream.fail()) { cout << "Input file open failed\n"; exit(1); // requires <stdlib.h>}

5: To get data from a file (one option), must declare a variable to hold the data and then read it using the extraction operator: int num; in_stream >> num; [Compare: cin >> num;] 6: To put data into a file, use insertion operator: out_stream << num; [Compare: cout << num;] NOTE: Streams are sequential data is read and written in order generally can't back up. 7: When done with the file: in_stream.close();

Example (creating file)


#include<fstream.h> #include<process.h> Void main() { int rollno char name[10]; ofstream ofil(stud.txt); cout<<enter details; cin>>rollno>>name; cout<<writing student details into file..; ofil<<rollno<<endl<<name; getch();

Reading a file
#include<fstream.h> #include<process.h> Void main() { int rollno char name[10]; Ifstream ifil(stud.txt); If(!ifil) { Cout<<can not open file; Exit(-1); }

cout<<reading data from file; ifil>>rollno>>name; cout<<roll no is<<rollno<<endl; cout<<name is<<name<<endl; getch(); }

File Open Modes


ios:: app - (append) write all output to the end of file ios:: ate - data can be written anywhere in the file ios:: binary - read/write data in binary format ios:: in - (input) open a file for input ios::out - (output) open a file for output ios:: trunc -(truncate) discard the files contents if it exists

Stream state member functions


In C++, file stream classes inherit a stream state member from the ios class, which gives out the information regarding the status of the stream. For e.g.: eof() used to check the end of file character fail()- used to check the status of file at opening for I/O bad()- used to check whether invalid file operations or unrecoverable error . good()- used to check whether the previous file operation has been successful

File Input and Output Using Objects


Example: #include<fstream.h> class student { private: int iReg_no; char name[20]; public: void setRegno() { Cout<<registration no; Cin>>iReg_no; }

void setName() { Cout<<enter name; Cin>>name; } int getRegno() { Cout<<iReg_no; } char getName() { Cout<<name; } };

File Input and Output Using Objects (Contd.)

void main()
{ ofstream Sfil(studfile.dat); char ch; student Svar; Svar.setRegno(); Svar.setName(); Sfil<<Svar.getRegno() << <<Svar.getName(); Sfil.close(); //Closes the open file

File Input and Output Using Objects (Contd.)

cin>>ch; if(ch== y) { ifstream Sfil(studfile.dat); char ireg;char nam[20]; Sfil>>ireg>>nam; cout<<\n Registration Number is <<ireg; cout<<\n Student Name is <<nam; }

cout<< \n Do you want to view the contents of a file (y/n)?;

// Initial experience reading and writing files #include <fstream.h> #include <iostream.h> #include <stdlib.h> int main() { ifstream in_stream; ofstream out_stream; int num; in_stream.open("numbers.dat"); if (in_stream.fail()) { cout << "Input file could not be opened.\n"; exit(1); } out_stream.open("squares.dat"); if (out_stream.fail()) { cout <<"Output file could not opened.\n"; exit(1); } in_stream >> num; out_stream << "The square of " << num << " is " <<num * num; in_stream.close(); out_stream.close(); }

INPUT AND OUTPUT OPERATION put() and get() function the function put() writes a single character to the associated stream. Similarly, the function get() reads a single character form the associated stream. example : file.get(ch); file.put(ch); write() and read() function write() and read() functions write and read blocks of data. example: file.read((char *)&obj, sizeof(obj)); file.write((char *)&obj, sizeof(obj));

int main() { ifstream mys; char c; mys.open("new.txt"); if(mys.fail()) { cout<<"file not found"; }

while (!mys.eof()) { cout << c; mys.get(c); } mys.close(); getch(); return 0; }

class Person { private: char name[40]; int age; public: void getData() { cout << " Enter name:"; cin >> name; cout << "\n Enter age:"; cin >> age; }} ;

int main() { Person per ; per.getData(); ofstream outfile("Person.txt"); outfile.write((char*)&per, sizeof(per)); return 0; getch();}

struct record { char player[20]; int age; int runs; }emp; void add() { ofstream fp("jk.txt",ios::out);

if(!fp) { cout<<"not exits"; exit(1); } cout<<"enter name and age and runs"; cin>>emp.player>>emp.age>>emp.runs ; fp.write((char *)&emp,sizeof(emp)); fp.close();

void display() { ifstream fp("jk.txt",ios::in); if(!fp) { printf("file cannot be opened"); exit(1); } printf("records entered"); fp.read((char *)&emp,sizeof(emp)); cout<<emp.player<<" "<<emp.age<<" "<<emp.runs; fp.close(); } int main() { add();

deletion
void del() { int r; student obj; ifstream fp1; ofstream fp2,fp3; fp1.open("student.dat",ios::in); fp2.open("temp1.txt",ios::app); fp3.open("temp2.dat",ios::app); puts("Enter the deleting roll no."); cin>>r;

while(fp1.read((char *)&obj,sizeof(obj))) { if(r==obj.roll()) { fp2.write((char *)&obj,sizeof(obj)); } else { fp3.write((char *)&obj,sizeof(obj)); } } remove("student.txt");

updating
void update() { student obj; int r; ifstream fp1; fp1.open("student.txt"); ofstream fp2; fp2.open("temp.txt",ios::app); puts("Enter the rollno. to be modified"); cin>>r;

while(fp1.read((char*)&obj,sizeof(obj))) { if(obj.roll()==r) { puts("Enter new roll no. and name"); obj.getdata(); fp2.write((char*)&obj,sizeof(obj)); } else { fp1.write((char *)&obj,sizeof(obj)); } } remove("student.txt");

File pointers The get Pointer

Specifies the location in the file where the next read operation will occur

The put Pointer

Specifies the location in the file where the next write operation will occur

The seekg() Function

Helps to control the get pointer Moves the get pointer to an absolute address within the file or to a certain number of bytes from a particular position Takes two arguments:
The number of bytes to move The reference in the file from where the pointer has to be repositioned

Example: ifstream iFil; iFil.seekg(10,ios::beg);

The tellg() Function

Helps to control the get pointer Can be used to find the current position of the get file pointer in a file Does not take any arguments Example: int iPosition=iFil.tellg();

The seekp() Function

Helps to control the put pointer Moves the put pointer to an absolute address within the file or to a certain number of bytes from a particular position

The tellp() Function

Helps to control the put pointer Can be used to find the current position of the put file pointer in a file

Example
To find the size of the file #include<fstream.h> #include<process.h> Void main() { Ifstream ifil(abc.txt); If(!ifill) { Cout<<file cannot open correctly; exit(-1);

ifill.seekg(0,ios::end); int x=ifil.tellg(); Cout<<size of file is<<x; }