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.
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.
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.
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
%>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With