Apoorva sahay
Apoorva sahay

Reputation: 1930

just want to know whether there is a possible data loss?

I have written a piece of code which writes either to console or to a file depending upon the boolean value set by user.

The code looks like this.

#include <iostream>
#include <fstream>

int main()
{
    bool bDump;
    std::cout<<"bDump bool"<<std::endl;
    std::cin>>bDump;
    std::ostream* osPtr;
    std::ofstream files;

    if(bDump)
    {
    files.open("dump.txt");
    osPtr = &files;
    }
    else
    {
    osPtr = &std::cout;
    }

    std::ostream& stream = *osPtr;
    stream<<"hello";

    if(bDump)
    {
    files.close();
    }
    return 0;
}

Here I am creating a std::ostream pointer and depending upon boolean value I am assinging address of either an ofstream object or std::cout. My only concern here whether the file operation like open or close are done properly or not. As I am new to c++ please help me out. Also point out if any bad programming practice is being followed here.

Upvotes: 0

Views: 155

Answers (3)

Loki Astari
Loki Astari

Reputation: 264631

Its correct and works.
The main thing I would do differently is not to explicitly call close() as this is done automatically by the destructor.

You can simplify your code slightly (and get rid of the pointer) with the ternary operator;

#include <iostream>
#include <fstream>

int main()
{
    bool bDump;
    std::cout  << "bDump bool"<<std::endl;
    std::cin   >> bDump;
    std::ofstream files;

    std::ostream& stream =  (bDump) ? (files.open("dump.txt"), files)
                                    : std::cout;

    stream<<"hello";    
}

Upvotes: 4

John Zwinck
John Zwinck

Reputation: 249462

You did everything fine, but there is no need for the close() at the end, because in C++ we rely on destructors to clean up for us, and std::ofstream has one which closes the file automatically.

You can also omit the return 0; statement at the bottom of main() in C++: 0 (success, really) will be returned by default.

Upvotes: 0

aingram
aingram

Reputation: 446

There's no potential leak. However, if an exception is thrown by

stream<<"hello";

then

files.close();

will never be called, but for your specific example of code there's no concern. ofstream's destructor happens to call close() for you.

Upvotes: 0

Related Questions