C++ Files and Streams: In the C++ files and streams the operations are performed by using streams too. By using the file handling we can store our data in the secondary storage device. The operations on files can be done by using three classes. They are as follows:
- ofstream: Stream class to write on files
- istream: Stream class to read from files
- fstream: Stream class to both read and write from/to files.
C++ Files and Streams
fstream
You have to include the fstream library to able to work with files. Class fstream encapsulates both properties of ifstream and ofstream classes. In this case, you want to open the file only for input operations, you have to use an ifstream object. In the case, you want only to write to file, use an ofstream object.
Achieving File Handling
For achieving file handling in C++, we should follow these steps
- name a file
- open the file
- Reading data from a file
- Writing data into a file
- Closing a file
Functions used in the File Handling
Function | Operation |
---|---|
open( ) | To create a file |
close( ) | To close an existing file |
get( ) | Read a single character from a file |
put( ) | write a single character in a file |
read( ) | Read data from the file |
write( ) | Write data into a file |
File Opening Modes
There are different modes in which you can open a file:
- in – file is opened for input.
- out – file is opened for output.
- binary – binary file is opened.
- ate – output position is set to the end of the file when a file is opened.
- app – all the outputs are appended to the existing contents of the file.
- trunc – erase data from the file.
Example:
Open File by using constructor
ifstream (const char* filename, ios_base::openmode mode = ios_base::in);
ifstream fin(filename, openmode) by default openmode = ios::in
ifstream fin(“filename”);
Open File by using open method
Calling of default constructor
ifstream fin;
fin.open(filename, openmode)
fin.open(“filename”);
fstream
The default value for fstream mode parameter is in | out. It means that the file is opened for reading and writing when you use fstream class.
Example:
fstream file; //open file text.txt for input and output file.open("test.txt"); //check if file is opened if (!file.is_open()) cout << " Cannot open file!" << endl; //write a message to file file << "This is the first line " << endl << "This is the second line" << endl; file.seekg(ios::beg);//reset position of the input //read first 5 number from test.txt for (int i = 0; i != 5; ++i) { //show read value on screeen cout << (char)file.get() << endl; } //get the next character from file char next = file.get(); cout << "The next character is " << (char)next << endl; //reset position again file.seekg(ios::beg); char* str = new char[50]; //extract first line into str file.getline(str, 50); //show first line cout << str << endl; //ignor next extracted character file.ignore(); //show the next character without extracting it from file cout << "Peek " << (char) file.peek() << endl; //get current position cout << "Current position is " << file.tellg() << endl; //after all work with file is done //close it file.close();
Output:
T
h
i
s
istream
The istream allows object assignment. The predefined object cin is an object of this class and thus may be reassigned at run time to a different istream object.
Example:
#include <iostream> using namespace std; class demo { public: int dx, dy; // operator overloading using friend function friend void operator>>(demo& d, istream& mycin) { // cin assigned to another object mycin mycin >> d.dx >> d.dy; } }; int main() { demo d; cout << "Enter two numbers dx and dy\n"; // calls operator >> function and // pass d and cin as reference d >> cin; // can also be written as operator >> (d, cin) ; cout << "dx = " << d.dx << "\tdy = " << d.dy; }
Output:
Enter two numbers dx and dy
3 8
dx = 3 dy = 8
ofstream
When you use ofstream class, the default value for mode is out and the default value for an ifstream class is in.
Modes
Member Constant | Represents | Access |
---|---|---|
in * | input | File open for reading: the internal stream buffer supports input operations. |
out | output | File open for writing: the internal stream buffer supports output operations. |
binary | binary | Operations are performed in binary mode rather than text. |
ate | at end | The output position starts at the end of the file. |
app | append | All output operations happen at the end of the file, appending to its existing contents. |
trunc | truncate | Any contents that existed in the file before it is open are discarded. |
Close
File are closed by using close( ) member function.
Example:
void close(); //after all work with file is done //close it file.close();
get
You can extract characters from the stream when you open it for reading by using get( ) member functions. There are two possibilities to get unformatted input by using get( ) function.
Extract single character
Syntax: char get();
Single character code is returned.
Extract C-string
Syntax: istream& get (char* str, int n, char delim = ‘\n’);
Extract characters into str until n-1 characters are not extracted or delim character is not met.
Example:
fstream file; //open file text.txt for input and output file.open("test.txt"); if (!file.is_open()) cout << " Cannot open file!" << endl; //write ten numbers to test.txt for (int i = 0; i != 10; ++i) file << i << endl;//write i with newline character to text.txt file.seekg(ios::beg);//reset position of the input //read first 5 number from test.txt for (int i = 0; i != 5; ++i) { //show read value on screeen cout << (char)file.get() << endl; }
Output:
0
1
2
getline
getline( ) member function extracts a line into an array of characters pointed by str until n-1 characters are not extracted or delim character is not met.
Syntax: istream& getline (char* str, streamsize n, char delim = ‘\n’);
ignore
ignore member function extracts characters from the file and ignores them until n characters are not extracted, delim or end of file (EOF).
Example:
istream& ignore (int n = 1, int delim = EOF);
If EOF is reached, the eofbit flag is set.
Peek
It returns the next characters in the stream but does not extract it.
Syntax: int peek( );
Putback
Putback function returns character c to stream.
Example:putback (char c);
seekg
There is a possibility to set the position of the next extracted value from the stream. It is done by using seekg functions.
Example: seekg (int pos);
tellg
In the same time, you can get the current position in the file input stream with tellg function.
Example: int tellg( );