Mit Opencourseware: 6.096 Introduction To C++

Download as pdf or txt
Download as pdf or txt
You are on page 1of 6

MIT OpenCourseWare http://ocw.mit.

edu

6.096 Introduction to C++


January (IAP) 2009

For information about citing these materials or our Terms of Use, visit: http://ocw.mit.edu/terms.

Massachusetts Institute of Technology 6.096


Lecture 9- Part 1
File Handling

Streams in C++ A stream is basically flow of data from or to the program. There are two types of streams 1. Input Stream- An input stream is flow of data into the program (e.g. cin) 2. Output Stream- An output stream is flow of data out of the program (e.g. cout) What does iostream.h contain? #include<iostream>
When we write this at the beginning of the program, it basically means that we are
instructing the compiler to include the contents of the file iostream.h into our source file
before compiling.
iostream.h (short for input/output stream) has certain classes and objects defined within
the file, which we can use in our program directly. It contains the following classes for
input/output of data:
ios- Base class for all other classes for input and output istream- Derived from ios. Used to input data into the program (input stream). cin is an object of this class. ostream- Derived from ios. Used to output data out of the program (output stream). cout is an object of this class.

Meaning of cin>> and cout<< When we write the statement: cout << "Hello"; the << (insertion operator) passes the value following it (i.e a char * pointing to the string Hello) to the object cout, which in turn acts as an output stream, and hence passes it on to the screen from the program. Similarly, when we write the statement: string s; cin >> s; The >> (extraction operator) passes each character of the value the user enters to the object cin, which in turn acts as an input stream, and hence passes it from the keyboard into the program.

The problem with cout<< is that it only allows flow of data from the program to the screen. Similarly, cin>> only allows flow of data from the keyboard into the program. In order to output data from our program to a physical file, or to input from a physical file into our program, we use the concept of file-handling. We will work with text files for now. #include<fstream> The file fstream.h contains all the contents of iostream.h (istream class, ostream class etc.), along with certain classes of its own. It contains: ifstream- Class derived from istream. Allows input from other sources apart from just the keyboard. ofstream- Class derived from ostream. Allows output other than just the screen. fstream- a class which contains all the contents of ifstream, and ofstream through multiple inheritance. Writing to a physical file (say abc.txt)
fstream f; //Declare an object of class fstream
f.open("abc.txt",ios::out); //open the file using a stream
f << "Hello" << endl; //write to file using the object declared
f << "World" << endl;
f.close(); //close the file

Reading from a physical file:


fstream f; //Declare an object of class fstream
f.open("story.txt",ios::in); //opening the file using a stream
string s;
f >> s; //read from file using the object declared
f.close(); //close the file

The open() function is used to opening an object in a particular stream. It takes two arguments, the name of the file (datatype char*), and the mode in which to open the file. ios::out- Output mode to take data from program out to a file. ios::in- Input mode to take data from file into the program. ios::app- Append mode to add data to an existing file. If this is not specified, opening the file in output mode will overwrite the existing contents of the file, if the file already exists. ios::trunc- Truncate mode to indicate that the file, if it exists, should be
overwritten on.
The mode can be have more than one value, separated by the | operator. For example:
F.open("abc.txt", ios::out | ios::app);

Additional ways to read from file If you have an object which opens a file in input mode, writing F >> s; Is similar to doing cin >> s. Just like cin >>, F >> would read just a word from the file, as it takes any white-space (i.e space, tab or new line) as a string terminator. There are a few alternate ways of inputting data: getline()
It is a member function of class istream, and is used to input a line from the user. For
example:

cin.getline(str,80);

It takes 3 arguments 1. the name of the string (usually a character array and not a cstyle string) 2. Maximum number of characters in the string (it is important to remember that the last character must also be string terminator) 3. A delimeter which terminates string input as soon as it is encountered (default is the enter key) i.e as soon as the user enters the enter key, the string is terminated We can also use getline() with fstream objects:
fstream F;
char str[80];
F.getline(str,80);

get()
It is a member function of class istream, and is used to input a character from the
user. For example:

char ch;
ch=cin.get();

Similarly it can also be used with fstream objects:


ch=F.get();

getline() (non-member version)


This is NOT a member function of class istream. It can be used to store all input
from a stream up to a newline in a string object. For example:

string str;
getline(cin, str); //Reads a line from keyboard
// input until user types newline
//("Enter")

Similarly, it can also be used with fstream objects:

ifstream F("myFile.txt");
getline(F, str);

Checking for end of file When reading the entire contents of a file, it is often required to check whether we have reached the end of a file or not. There are a variety of ways to do this: Function eof()- end of file This is a function which returns true if we have reached the end of a file.
fstream f;
f.open("story.txt",ios::in);
string s;
f>>s;
while(!f.eof())
{
cout<<s<<endl;
f>>s;
}

Successful Read We can also check the end of a file by checking whether a read has been successful or not.
fstream f;
f.open("story.txt",ios::in);
string s;
while(f>>s)
{
cout<<s<<endl;
}

OR
fstream f;
f.open("story.txt",ios::in);
char s[80];
while(f.getline(s,80))
{
cout<<s<<endl;
}

The condition in the while statement in both cases, evaluates to true as long as a read from the file has been successful, and as soon as the read becomes file (indicating that the end of the file has been reached), it evaluates to false. In practice, eof() also returns a value false after an unsuccessful read. Thus, you should be careful while using eof(), as it might still evaluate to true before a file has ended if a read has not been unsuccessful. To avoid this, we can check eof() before attempting to read. For example:

fstream f;
f.open("story.txt",ios::in);
string s;
while(!f.eof())
{
f>>s;
cout<<s<<endl;
}

This returns the last word twice, because even though the last word has been read, and printed, there has not been an unsuccessful read, and eof() still evaluates to false. The condition evaluates to true after the next read is unsuccessful, and hence an extra cout<< is executed.

You might also like