Top Banner
Object Oriented Programming File Handling in C++
58
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: File Handling

Object Oriented Programming

File Handling in C++

Page 2: File Handling

What is a File?

• Combination of characters, words, sentences and paragraph are called as file.

• Two Types of files– Text File (readable English characters)– Executable program file (Dos Command)

Page 3: File Handling

File Properties

• Name of the file• Path of the file (Absolute & Relative)• Length of the file• Date of Creation • File Access

Page 4: File Handling

Why do we need files?

• Information of the computer is volatile• Execute the program and the data is saved on

the hard disk.• e.g Payroll system for SEECS Employees• Store information once and reuse it• Read/write/manipulate the data is File

handling

Page 5: File Handling

File Handling

• Two ways to Access the Files– Sequential Access File– Random Access File

Page 6: File Handling

Text File Handling

• Basic steps for File handling

– Open the file– Read and Write – Close the File

Page 7: File Handling

Cont…

• Previously we worked with “cin” and “cout”.• Concept of Streams• During File Handling a header file called

“<fstream.h>” is to be included.• <fstream.h> is a header file for file streams.

Page 8: File Handling

8

Read and Write file

• When we read the file, it means that file is used as an input for the program.

• We need to have a stream for input file• ifstream ( input file stream)

• In order to read and write from the same file , ofstream.

Page 9: File Handling

Declaring File Stream (Step 1)

ifstream inFile; //object for reading from file

ofstream outFile; //object for writing into file

NOTE: The variable/ objects inFile and outFile are used as

“handle to refer” files.

Page 10: File Handling

Cont…..(Step 2)

• So far we didn’t attach the file with a handle.– ifstream myFile;

• We must open a file. • For this we will use a function “Open”.

– myFile.open(Filename);Note: Absolute / Relative Path for Filename

Page 11: File Handling

Cont…..(Step 3)

• Tell the compiler what you want to do with file i.e read, write or modify .

• Once the file is opened we can read it. myFile>>c;

/* The first word of the file will be read in c, where c is a character array, same as using cin. */

Page 12: File Handling

Cont…

myFile>>c1>>c2>>c3;

// The first word will be read in c1,2nd in c2, 3rd in c3.

Page 13: File Handling

Cont….(Step 4)

• File must be closed and it is the responsibility of programmer to close the file.

• myFile.close();• No argument in close function.

Page 14: File Handling

Think…….

• What if the File that we are trying to open does not exist on the disk?????????

Page 15: File Handling

Error Checking Mechanism

• It is very important• ifstream myFile; myFile.open(“mytext.txt”);

/*If this file does not exists on the disk, the variable myFile will not be associated with any file. We must make sure that the file opening process is successful. */

Page 16: File Handling

Cont…

If(!myFile) { cout<<“There is some error opening the

file”<<endl; cout<<“ File cannot be opened”<<endl; } else cout<<“File opened successfully”<<endl;

Page 17: File Handling

Example:#include <fstream.h>void main(){ char name[50]; char sal[10]; char dept[30]; ifstream inFile; inFile.open("myfile.txt"); if(!inFile) { cout<<"Can’t open input file"<<endl; } while(!inFile.eof()) { inFile>>name>>sal>>dept; cout<<name<<"\t“<<sal<<“\t”<<dept<<endl; } inFile.close();} //end of main

Page 18: File Handling

Output of the Program

Name Salary Department Omer 20000 Exam Ali 40000 Faculty Rashid 60000 Faculty

Page 19: File Handling

Output File Handling

• Creation of a new file on the disk and writing data in it. or • Open an existing file and overwrite it in such a manner that

all old information is lost from it and new information is stored.

or • Open an existing file and append it in the end or• Open an existing file and modify it from anywhere.

Page 20: File Handling

Cont…

• We can use the previous options when opening the file.

• open(filename,mode)

• The first argument is the name of the file, second argument will the mode of the file.

Page 21: File Handling

Cont…..

• Syntax myFile.open(“myFile.txt”, ios::in);

or myFile.open(“myFile.txt”);

/* The second argument associated myFile stream object with “myFile.txt” for input. */

// There are different modes available

Page 22: File Handling

File output: Appending#include <fstream>#include<iostream>

using namespace std;

void main()

{ cout<<"creating a file"<<endl;

ofstream afile("test1.dat"); cout<<"writing to file.."<<endl;

afile<<"these are test data";

} //end of file

Page 23: File Handling

ios :: in open for reading (default for ifstream)ios :: out open for writing (default for ofstream)ios :: app start writing at end of file (APPend)ios :: ate start reading or writing at EOF of file (ATEnd)ios :: trunc truncate file to zero length if it exists (TRUNCate)ios :: nocreate error when opening if file does not already existios :: noreplace error when opening for output if file already existsios :: binary open file in binary (not text) mode

List of File Handling Modes

Page 24: File Handling

24

Cont…

Mode Meaning

in Open a file/stream for extraction (input)

out Open a file/stream for insertion

(output)

App Append rather than truncate an existing file. Each insertion (output) will be written to end of the file.

trunc Discard the file contents if exists (similar to default behavior

ate Opens the file without truncating, but allows data to be written anywhere in the file.

binary Treat the file as binary rather than text. A binary file has data stored in internal formats, rather than readable text.

Page 25: File Handling

Important……

• If a file is opened with ios::out mode, a new file is created. However if the file already exists, its contents will be deleted and get empty unless you write something to it.

Page 26: File Handling

Example 2main()

{

ofstream outFile;

outFile.open(“myFileOut.txt”,ios::out);

if(!outFile)

{

cout<<“ cannot open file”<<endl;

}

outFile.close();

}

Page 27: File Handling

Try yourself…..

Write a program, which reads an input file of employee’s i.e. employeein.txt”. Add the salary of each employee by 200, and write the result in new file “ employeeout.txt”??

Page 28: File Handling

get( )

• “>>” sign is not enough• get( ) function is used to get a character from the file.• The last character in the file is EOF, defined in header file.• E.g char c; while((c=inFile.get( ) !=EOF) { //do all the processing outFile.put(c); }

Page 29: File Handling

Why get( )

• >> does not read the new line character where as the get( ) function reads each character as it is typed.

• If we need to make copy of the file then get( ) function must be used.

Page 30: File Handling

put( )

• put( ) function writes a character including new line feed to the file.

Page 31: File Handling

Think…….

What if we want to write/read a whole line to file instead of writing character or words. After all the processing speed now is day is quite high?

Page 32: File Handling

getLine()

• Two functions– getLine() for input file stream– putLine() for output file stream

// char name[100]; int maxChar=100; int stopchar=‘o’; inFile.getLine(name,maxChar,stopchar);

myfile.getline (char *s, int n, char delim);

Character array delimiter

Numbers of characters to

be read

Page 33: File Handling

Try yourself…..

• Write a program which reads a file using the getLine() function and display it on the screen?

Page 34: File Handling

fail()

• A call to open can be unsuccessful for a number of reasons.

• A member function of ifstream and ofstream named fail can be used to test whether or not a stream operation has failed.

• It take no arguments and returns a bool.• Syntax:

– in_stream.fail( );

Page 35: File Handling

Cont…

Example: in_stream.open(“stuff.dat”); if (in_stream.fail()){ cout<<“input file opening failed.\n”; exit();

//to use this function include #include <cstdlib>

}

Page 36: File Handling

isspace()

• The function isspace() returns true if its argument is a whitespace character else returns false.

• Whitespace are all the characters that are displayed as blank space on the screen, including the blank character, the tab character, and the new-line character ’\n’.

Page 37: File Handling

Example:The following program will read the sentence terminatewith the period and echo the string with all whitespacecharacters replace with the symbol “_”.

char next;do{ cin.get(next); if(isspace(next)) cout<<‘_’; else cout<<next; } while (next !=‘.’);

Page 38: File Handling

Try it yourself !!!!!!

Write a program that creates the output file “myoutput.txt” that is identical to the file“myoriginal.txt” except that all theoccurrences of ‘C’ are replace by “C++”.

Page 39: File Handling

Random Access Files

• Discuss how to access the files randomly, forward and backward.

• Current position inside the file.• Concept of file position ( Pointer into the file)• tellg( ) and tellp( )----functions for

determining the file pointer position.

Page 40: File Handling

Position in a File

• Assume that a file stream myfile is opened for reading .

• Myfile.tellg( ) gives us the current get position of the file pointer.

• It returns a whole number of type long, which is the position of the next character to be read from that file.

• tellp() function is used to determine the next position to write a character while writing into a file. It also returns a long number.

Page 41: File Handling

Setting the Position

• How to move forward and backward within the file????

• seekg( ) and seekp( ) functions• seekg( )--- takes us to certain position to start

reading.• seekp( )---> leads the position to write into.• Both functions require an argument of type long to

let them know the number of bytes to move forward or backward. (positive and negative number)

Page 42: File Handling

filePtr.seekg ( long Num , ios :: origin ) ;filePtr.seekg ( long Num , ios :: origin ) ;

Number of characters to move to

Starting point

Setting the Position

seekg ( 10L , ios :: beg ) ;seekg ( 10L , ios :: beg ) ;seekg (10L , ios :: cur ) ;seekg (10L , ios :: cur ) ;

seekg ( 10L , ios :: end ) ;seekg ( 10L , ios :: end ) ;

Page 43: File Handling

Example:--)• aFile.seekg(10L, ios::beg) //move 10 bytes forward from the beginning of the file.• aFile.seekg(20L, ios::cur) // move 20 bytes in the forward direction starting from current

position (where current position can be obtained by using tellg( ) function.

• aFile.seekg(-10L,ios::cur) // move 10 bytes in the backward direction from the current

position• aFile.seekg(-100, ios::end) // move 100 bytes in backward direction from the end of the

file.

Page 44: File Handling

Think and Apply…..

• Try to move the file pointer beyond the end of the file and before the beginning of the file and observe the behavior…….

Page 45: File Handling

Example 1#include<fstream.h>main ( ){

int length ; ifstream inFile ( “myFile.txt” ) ; inFile.seekg ( 0L , ios :: end ) ; length = inFile.tellg ( ) ;

}It will tell you Length of the file

Page 46: File Handling

read ( ) and write ( ) Functions

read ( char *buff , int count ) ;

write ( char *buff , int count ) ;

Area in memoryNumber of bytes to

be read

Area in memoryNumber of bytes to

be written

Page 47: File Handling

char str [ 10000 ] ;myInputFile.read ( str , 10000 ) ;myOuputFile.write ( str , 10000 ) ;

Example 3

1. Read 10000 bytes from the file into str2. Write 10000 bytes to a file from str

Page 48: File Handling

Example 2:This program firstly writes a string into a file and then replaces it partially.

main(){ long pos; ofstream outfile; outfile.open(“test.txt”); outfile.write(“this is an apple”,16);

//write the string in the file pos=outfile.tellp();

//get the file pointer position outfile.seekp(pos-7);

// move 7 positions backward outfile.close(); }

Page 49: File Handling

Try it !!!!!!!!

• Write a program that read the contents from “myfile1.txt” and copies the contents in reverse order in “outputfile.txt”……..

(Hint:---Make use of seekg function)

Page 50: File Handling

HINTS:-)afile.seekg(0L, ios::end);afile.seekg(-1L, ios::end);//set the position of the cursor to the last character

of the file

while(afile){ cout<<afile.tellg()<<endl; afile.get(c); Ofile.put(c); afile.seekg(-2L,ios::cur);

//set the position of the cursor to the one character before the current position

}

Page 51: File Handling

fstream

fstream myFile ( “Sample.txt” , ios :: in | ios :: out ) ;

Page 52: File Handling

Example:- Try to understand by yourself

fstream rfile;main(){char rchar;rfile.open(“myfile.txt”,ios::in||ios::out)if(!rfile){ cout<<“error opening file”;}for(rchar=‘A’;rchar<=‘Z’;rchar++){ rfile<<rchar; }rfile.seekg(8L, ios::beg);rfile>>rchar;cout<<“the 8th char is”<<rchar;rfile.seekg(-16L, ios::end);rfile>>rchar;cout<<“ the 16th character from the end”<<rchar;rfile.close();}

Page 53: File Handling

reinterpret_cast

• Unfortunately, most pointers that we pass to function write as the first argument are not of type const char *

• To output objects of other types, we must convert the pointers to those objects to type const char *

• C++ provides the reinterpret_cast operator for cases like this in which a pointer of one type must be cast to an unrelated pointer type

– You can also use this cast operator to convert between pointer and integer types, and vice versa

CPS235: FilesAndStreams 53

Page 54: File Handling

reinterpret_cast

• A reinterpret_cast is performed at compile time and does not change the value of the object to which its operand points

– Instead, it requests that the compiler reinterpret the operand as the target type (specified in the angle brackets following the keyword reinterpret_cast).

• Here we are using a reinterpret case to convert an int* (the type of the expression &num) to a const char*

• The same conversion would have to be done in case of the read() function of the istream class

CPS235: FilesAndStreams 54

Page 55: File Handling

Writing Bytes with ostream Member Function write()

• To write an int variable num to the file, use:outFile.write( reinterpret_cast< const char *

>(&num ), sizeof( num) );

OR• outFile.write((char *)&num , sizeof( num) ); • This writes the binary version of the number’s 4 bytes• Function write treats its first argument as a group of bytes by

viewing the object in memory as a const char*, which is a pointer to a byte (remember that a char is one byte)

• Starting from that location, function write outputs the number of bytes specified by its second argument, an integer of type size_t

CPS235: FilesAndStreams 55

Page 56: File Handling

56

int main() {

ifstream inCredit( "credit.dat", ios::in );

// exit program if ifstream cannot open file

if ( !inCredit ) {

cout << "File could not be opened." << endl;

exit( 1 );

} // end if

cout << "Account" << "Last Name“ << "First Name”<< "Balance

<< endl;

ClientData client; // create record

// read first record from file

inCredit.read( reinterpret_cast< char * >( &client ),

sizeof( ClientData ) );

Page 57: File Handling

57

// read all records from file

while ( ! inCredit.eof() ) {

// display record

if ( client.getAccountNumber() != 0 )

outputLine( client );

// read next from file

inCredit.read( reinterpret_cast< char * >( &client ),

sizeof( ClientData ) );

} // end while

return 0;

} // end main

// display single record

void outputLine(const ClientData &record ) {

cout << record.getAccountNumber()

<< record.getLastName()

<< record.getFirstName()

<< record.getBalance() << endl;

} // end outputLine

Page 58: File Handling

58

Account Last Name First Name Balance

33 Dunn Stacey 314.33

37 Barker Doug 0.00

88 Smith Dave 258.34

96 Stone Sam 34.98