Explain I/O manipulators and give examples:
MANIPULATORS
MANIPULATORS
Custom manipulators( i.e user defined manipulators)
In
addition to overloading the insertion and extraction operators, you can
further customize c++’s I/O system by creating your own manipulator
function Custom manipulators are important for two main reasons. First, a
manipulator can consolidate a sequence of several separate I/O
operations. For example, it is not uncommon to have situations in which
the same sequence of I/O operations occurs frequently within a program.
In these cases you can use a custom manipulator to perform these
actions, thus simplifying your source code and preventing accidental
errors. Second, a custom manipulator can be important when you need to
perform I/O operations on a nonstandard device. For example, you could
use a manipulator to send control codes to a special type of printer or
an optical recognition system.
Custom
manipulators are a feature of C++ that supports OOP, but they can also
benefit programs that aren’t object oriented. As you will see, custom
manipulators can help make any I/O-intensive program clearer and more
efficient.
Type of Manipulators:
As you know, there are two basic types of manipulators:
(1) operate on input streams
(2) operate on output streams
In
addition to these two bread categories, there is a secondary division:
those manipulators that take an argument and those that don’t. There are
some significant differences between the way a parameterless
manipulators and a parameterized manipulator are created. Further,
creating parameterized manipulators is substantially more difficult than
creating parameterless ones and is beyond the scope of this book.
However, writing your own parameterless manipulators is quite easy and
is examined here.
All parameterless manipulator output functions have this syntax:
ostream &manip-name(ostream &stream)
{
//code
return(stream);
}
Here
manip-name is the name of the manipulator and stream is a reference to
the involing stream. A reference to the stream is returned. This is
necessary if a manipulator is used as part of a larger I/O expression.
It is important to understand that even thought the manipulator has as
its single parameter(argument) a reference to the stream upon which it
is operating, no parameter(argument) is used when the manipulator is
called in an output operation.
All parameterless input manipulator functions have this syntax:
istream &manip-name(ostream &stream)
{
//code
return(stream);
}
An
input manipulator receives a reference to the stream on which it was
invoked. This stream must be returned by the manipulator.
It
is very important that you manipulators return a reference to the
invoking stream. If this is not done, your manipulators cannot be used
in a sequence of input or output operations.
Examples:
1.
as a simple first example, the following program creates a manipulator
called setup() that sets the field width to 10, the precision to 4, and
the fill character to *.
#include<iostream.h>
#include<conio.h>
ostream &setup(ostream &stream)
{
stream.width(10);
stream.fill(‘*’);
return(stream);
}
void main()
{
cout<<setup<<123.123456;
return(0);
}
In
the above prog, setup is used as part of an I/O expression in the same
way that any of the predefined manipulators would be used.
2. Custom manipulators (User Defined Manipulators)
c++ streams can also work well with the user -defined manipulators.Hence the user can
design their own manipulators .Hence the user can design their own manipulators to control
the appearance of the output depending upon their need.
the gereral syntax of creating a user-defined manipulator is as follows
ostream &manipulator (ostream &output,argument_if_any)
{
//mainpulator code
.
return output;
}
need not be complex to be useful. For example, the simple manipulators atn() and note(), given below, it gives a output frequently used words or phrases. (instead of atn(), note() we can write any name)
c++ streams can also work well with the user -defined manipulators.Hence the user can
design their own manipulators .Hence the user can design their own manipulators to control
the appearance of the output depending upon their need.
the gereral syntax of creating a user-defined manipulator is as follows
ostream &manipulator (ostream &output,argument_if_any)
{
//mainpulator code
.
return output;
}
need not be complex to be useful. For example, the simple manipulators atn() and note(), given below, it gives a output frequently used words or phrases. (instead of atn(), note() we can write any name)
#include<iostream.h>
#include<conio.h>
//attention
ostream &atn(ostream &stream)
{
stream<<”Attention:”;
return(stream);
}
//Please note:
ostream ¬e(ostream &stream)
{
stream<<”Please note:”;
return(stream);
}
void main()
{
cout<<atn<<”checking squads are coming! \n”;
cout<<note<<”handover your slip papers to avoid malpractice\n”;
}
....................................................................................................................................................................
Ex2:
#include<iostream.h>
ostream &digit(ostream&digit (ostream&num
{
num<<" "<< flush;
}
void main()
{
int a= 10,b=20;
cout<<a<<digit<<b<<endi;
}
Output:
10 20
Ex2:
#include<iostream.h>
ostream &digit(ostream&digit (ostream&num
{
num<<" "<< flush;
}
void main()
{
int a= 10,b=20;
cout<<a<<digit<<b<<endi;
}
Output:
10 20
Even though they are simple, if used frequently, these manipulators save you from some difficult typing frequently.
3. This program creates the getpass() input manipulator, which rings the bell and then prompts for a password:
#include<iostream.h>
#include<conio.h>
//a simple input manipulator
istream &getpass(istream &stream)
{
cout<<”\a”; //it sounds a bell
cout<<”enter your password:\n”;
return(stream);
}
void main()
{
char pw[80];
clrscr();
do
{
cin>>getpass>>pw;
}while(strcmp(pw,”password”;
cout<<”Logon complete\n”;
}
1. Creates an output manipulator that displays the current system time and date. Call this manipulator td().
2.
Creates an output manipulator called sethex() that sets output to
hexadecimal and turns on the uppercase and showbase flags. Also, create
an output manipulator called reset() that undoes the changes made by
sethex().
3. Create an input manipulator called skipchar() that reads and ignores the next ten characters from the input stream.
4. What are the input output manipulators?
flush : output manipulator it flushes the stream
endl : output manipulator it inserts a newline and flushes the buffer
ends : output manipulator that inserts end of string character.
ws : input manipulator that skips white spaces.
uppercase :output manipulator that replaces certain lowercase letters with their uppercase equivalents.
dec : is an i/o manipulator that converts integers to/from decimal notation.
hex : is an i/o manipulator that converts integers to/from hexadecimal notation
showbase : is an output manipulator that generates a prefix indicating the numeric base of an integer.
showpoint : is an output manipulator that always generates a decimal-point for floating-point values.
boolalpha : is an i/o manipulator that puts bool(Boolean) values in alphabetic format.
/* The first operation generally performed on an object of one of these classes is to associate it to a real file. This
Explain about Input/Output with files
C++ provides the following classes to perform output and input of characters to/from files:
- ofstream: Stream class to write on files
- ifstream: Stream class to read from files
- fstream: Stream class to both read and write from/to files.
These classes are derived directly or indirectly from the classes istream, and ostream. We have already used
objects whose types were these classes: cin is an object of class istream and cout is an object of class ostream.
Therfore, we have already been using classes that are related to our file streams. And in fact, we can use our file
streams the same way we are already used to use cin and cout, with the only difference that we have to associate
these streams with physical files. Let's see an example:
Define
(i)put() (ii)get()
explain the following file I/O functions.
(i)put() (ii)get()
ans:
ostream::put
Writes the character c to the output buffer at the current put position and increases the put pointer to point to the next character.
syntax: ostream& put ( char c );
Character to write.
Example:
// typewriter
#include <iostream>
#include <fstream>
void main ()
{
char ch;
ofstream outfile (
"test.txt");
do
{
ch=cin.get();
outfile.put (ch);
}
while (ch!=
'.');
getch();
}
explain the following file I/O functions.
ans:
(i)Open a file :
(i)Open a file :
/* The first operation generally performed on an object of one of these classes is to associate it to a real file. This
procedure is known as to open a file.*/
An open file is represented within a program by a stream object and any input or output operation
An open file is represented within a program by a stream object and any input or output operation
performed on this stream object will be applied to the physical file associated to it.
In order to open a file with a stream object we use its member function open():
syntax: open (filename, mode);
/*
- Where filename is a null-terminated character sequence of type const char * (the same type that string literals have) representing the name of the file to be opened,
- and mode is an optional parameter with a combination of the
following flags:
ios::in
|
Open for input operations.
|
ios::out
|
Open for output operations.
|
ios::binary
|
Open in binary mode.
|
ios::ate
|
Set the initial position at the end of the file.
If this flag is not set to any value, the initial position is the beginning of the file.
|
ios::app
|
All output operations are performed at the end of the file, appending the content to the current content
of the file. This flag can only be used in streams open for output-only operations.
|
ios::trunk
|
If the file opened for output operations already existed before, its previous content is deleted and
replaced by the new one.
|
- All these flags can be combined using the bitwise operator OR (|). For example, if we want to open the file example.bin in binary mode to add data we could do it by the following call to member function open(): ofstream myfile; myfile.open ("example.bin", ios::out | ios::app | ios::binary);
- Each one of the open() member functions of the classes ofstream, ifstream and fstream has a default mode that is used if the file is opened without a second argument:
CLASS
|
Default mode parameter
|
ofstream
|
Ios::out
|
ifstream
|
Ios::in
|
fstream
|
Ios::in | ios::out
/* | means bitwise operator OR */
|
For ifstream and ofstream classes, ios::in and ios::out are automatically and respectively assumed, even if a mode that does not include them is passed as second argument to the open() member function.
(ii) Closing a file
When
we are finished with our input and output operations on a file we shall
close it so that its resources become available again. In order to do
that we have to call the stream's member function close(). This member function takes no parameters, and what it does is to flush the associated buffers and close the file:
Syntax: rajfile.close();
Once
this member function is called, the stream object can be used to open
another file, and the file is available again to be opened by other
processes.
In case that an object is destructed while still associated with an open file, the destructor automatically calls the
member function close().
(iii) Reading and writing :
File streams include two member functions specifically designed to input and output binary data sequentially:
write and read. The first one (write) is a member function of ostream inherited by ofstream. And read is a
member function of istream that is inherited by ifstream. Objects of class fstream have both members. Their
Syntax: (or prototypes)
write ( memory_block, size );
read ( memory_block, size );
Where memory_block is of type "pointer to char" (char*), and represents the address of an array of bytes where
the read data elements are stored or from where the data elements to be written are taken. The size parameter is
an integer value that specifies the number of characters to be read or written from/to the memory block.