Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

very simple io question c++

Tags:

c++

io

Just started learning c++ today and im pretty boggled. its an amazing language but im having some trouble overwriting a file

#include <iostream>
#include <fstream>

using namespace std;

int main( )
{
    double payIncrease = 7.6;
    double annual;


    double annualIncrease;
    double newAnnual;

    double monthlyIncrease;
    double newMonthly;

    ifstream inStream;
    ofstream outStream;

// heres where the problem lies

        inStream.open("annualSalary.txt" );
        outStream.open("newAnnualSalary.txt");

if i change newAnnualSalary.txt to annualSalary.txt i get some very weird numbers. does anyone know why?

    inStream >> annual;
    inStream.close();
    double monthly = (annual/12);

    annualIncrease = ((annual/100)*payIncrease);

    monthlyIncrease = ((monthly/100)*payIncrease);


    newMonthly = (monthly + monthlyIncrease);
    newAnnual = (annual + annualIncrease);




    outStream <<"annual salary was: "<<  annual << "\n" ;  
    outStream <<"new annual salary is " << newAnnual << "\n ";
    outStream <<"new monthly salary is " << newMonthly <<"\n ";



    outStream.close();
    return 0;

}

im aware this is a very low skill level question but i am just learning.

like image 922
OVERTONE Avatar asked Sep 16 '10 15:09

OVERTONE


3 Answers

You can't open the same file as an istream and an ostream at the same time. Since you are closing the istream pretty early on, why not just put the ostream open call after the istream close? Alternatively you can use an fstream which will allow reads and writes.

like image 161
Niki Yoshiuchi Avatar answered Sep 23 '22 14:09

Niki Yoshiuchi


The stream classes (well, technically in this case the basic_filebuf class) are caching reads and writes to that file. The different file streams are not guaranteed to be synchronized.

Use a single fstream instead of two seperate streams to the file.

like image 23
Billy ONeal Avatar answered Sep 24 '22 14:09

Billy ONeal


It's because the default open parameter for ofstream is ios::out which destroys the contents of the file. This leaves your inStream object reading garbage into annual variable because it's pointing at the same file which just had it's contents destroyed. Hence your weird numbers.

Have inStream open the file and read the contents, close it, then open the outStream and write. This should fix the problem, but it would be best to ensure that no problems occur during processing before opening and destroying the file contents. If you don't you could encounter an error and end up with nothing in the file. Basically make sure you have good data to write before destroying the previous contents.

To show that what you're doing destroys the file:

#include <fstream>

using namespace std;
int main()
{
    ofstream x;
    x.open("ofTest.txt");
    x.close();
    return 1;
}

%> g++ test.cpp
%> cat ofTest.txt
Test file destruction
Test 1,2,3
%> ./a.out
%> cat ofTest.txt
%>
like image 23
RC. Avatar answered Sep 24 '22 14:09

RC.