2010-09-16 90 views
8

今天刚刚开始学习C++,我很惊讶。其惊人的语言,但遇到了一些麻烦IM覆盖文件非常简单的io问题C++

#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; 

//继承人问题所在

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

如果我改变newAnnualSalary.txt到annualSalary.txt我得到了一些非常奇怪的数字。 有谁知道为什么?

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意识到这是一个非常低技术水平的问题,但我刚学。

+2

“奇怪的数字”是什么意思? – Jess 2010-09-16 15:22:23

+1

它可能是因为你试图打开annualsalary.txt两次,一次入站和一次出站。尝试_not_打开您要覆盖的文件,直到您关闭它(即将outStream.open命令放入inStream.close命令后)以查看是否有帮助。 – 2010-09-16 15:26:11

+0

@Michael,外流正在打开newAnnualSalary.txt。他很好去:) – jlafay 2010-09-16 15:27:22

回答

9

无法同时打开与istream和ostream相同的文件。既然你很早就关闭了istream,为什么不在istream关闭后放ostream open调用呢?或者,您可以使用允许读取和写入的fstream。

2

这是因为forstream的默认打开参数是ios::out,这会破坏文件的内容。这会让你的inStream对象将垃圾读入年度变量,因为它指向的是只销毁其内容的同一个文件。因此你的怪异数字。

让inStream打开文件并读取内容,关闭它,然后打开outStream并写入。这应该解决问题,但最好确保在打开和销毁文件内容之前在处理过程中不会出现问题。如果你没有,你可能会遇到一个错误,并在文件中没有结果。基本上确保在销毁之前的内容之前有好的数据写入。

要表明你在做什么破坏了文件:

#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 
%> 
+0

不,这是'ios :: trunc' – 2010-09-16 15:26:23

+0

是的,ios :: trunc会截断文件,但ios :: out也是如此。尝试一下。 – 2010-09-16 15:35:58

+0

'ios :: in | ios :: out'不截断文件。单独的'ios :: trunc'不是有效的开放模式。 – Potatoswatter 2010-09-16 19:44:17

6

的流类(当然,技术上在这种情况下basic_filebuf类)的缓存读取和写入该文件。不同的文件流不保证被同步。

使用单个fstream而不是两个单独的流到文件。