2010-09-16 13 views
8

Ich habe gerade erst angefangen, C++ zu lernen und bin ziemlich verrückt. seine eine erstaunliche Sprache, sondern im einige Probleme mit einer Datei überschriebensehr einfach io Frage 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; 

// heres wo das Problem liegt

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

wenn ich newAnnualSalary.txt ändern ich einige sehr seltsame Zahlen bekommen annualSalary.txt. weiß jemand warum?

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 bewusst ist dies eine sehr niedrige Qualifikationsniveau Frage, aber ich lerne gerade.

+2

Was meinst du mit 'seltsame Zahlen'? – Jess

+1

Es _might_ sein, weil Sie versuchen, youncensalary.txt zweimal zu öffnen, einmal eingehend und einmal abgehend. Versuchen Sie _not_ nicht, die zu überschreibende Datei zu öffnen, bis Sie sie geschlossen haben (z. B. den Befehl outStream.open nach dem Befehl inStream.close), um festzustellen, ob dies hilfreich ist. –

+0

@Michael, der Outstream öffnet newAnnualSalary.txt. Er ist gut zu gehen :) – jlafay

Antwort

9

Sie können dieselbe Datei nicht gleichzeitig als istream und ostream öffnen. Da du den iStream schon früh geschlossen hast, warum stellst du den ostream nicht einfach nach dem iStream auf? Alternativ können Sie einen fstream verwenden, der Lese- und Schreibvorgänge zulässt.

2

Es ist, weil der Standard-Parameter für Offstream öffnen ios::out ist, die den Inhalt der Datei zerstört. Dadurch bleibt Ihr inStream-Objekt in der Jahresvariablen in Müll, weil es auf dieselbe Datei verweist, in der der Inhalt gerade zerstört wurde. Daher deine komischen Zahlen.

InStream öffnen Sie die Datei und lesen Sie den Inhalt, schließen Sie es, dann öffnen Sie den outStream und schreiben. Dies sollte das Problem beheben, aber es wäre am besten sicherzustellen, dass während der Verarbeitung keine Probleme auftreten, bevor der Dateiinhalt geöffnet und zerstört wird. Andernfalls könnten Sie auf einen Fehler stoßen und nichts in der Datei finden. Stellen Sie sicher, dass Sie gute Daten zum Schreiben haben, bevor Sie den vorherigen Inhalt löschen.

Um zu zeigen, dass das, was Sie tun, um die Datei zerstört: Caching liest und schreibt in diese Datei

#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

Nein, das ist 'ios :: trunc' –

+0

Ja, ios :: trunc schneidet die Datei ab, aber auch ios :: out. Versuch es. –

+0

'ios :: in | ios :: out' schneidet die Datei nicht ab. 'ios :: trunc' alone ist kein gültiger offener Modus. – Potatoswatter

6

Die Stream-Klassen (na ja, technisch in diesem Fall die basic_filebuf Klasse) sind. Die verschiedenen Dateiströme werden nicht garantiert synchronisiert.

Verwenden Sie eine einzelne fstream anstelle von zwei separaten Streams zu der Datei.