2010-09-16 107 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而不是兩個單獨的流到文件。