2010-09-16 27 views
8

Sadece bugün C++ öğrenmeye başladım ve çok hoş görünüyorsun. i newAnnualSalary.txt değiştirirsem bir dosyanın üzerine onun inanılmaz bir dil ancak bazı sorun yaşıyorum imçok basit io soru 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; 

sorun i bazı çok garip numaraları almak annualSalary.txt için

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

yatıyor // heres nerede. kimse neden olduğunu biliyor mu?

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 farkında bu çok düşük bir beceri seviyesi sorudur ama ben sadece öğreniyorum.

+2

'Tuhaf numaralar' ile ne demek istiyorsun? – Jess

+1

Bu _might_, yearsalary.txt dosyasını iki kez, bir kez gelen ve bir kez gönderildiğinde açmaya çalıştığınız için olabilir. Kapattıktan sonra üzerine yazmayı denediğiniz dosyayı açmaya çalışın (inStream.close komutundan sonra outStream.open komutunu yazın). –

+0

@Michael, outstream yeniAnnualSalary.txt dosyasını açıyor. Gidecek kadar iyiydi :) – jlafay

cevap

9

Aynı dosyayı bir istream ve bir ostream olarak aynı anda açamazsınız. İstediğin kadar erken kapattığın için, neden akımın kapatılmasının ardından neden açık aramayı açmıyorsun? Alternatif olarak, okuma ve yazmalara izin verecek bir fstream kullanabilirsiniz.

2

Bunun nedeni, içeriğin varsayılan açık parametresinin, dosyanın içeriğini yok eden ios::out olmasıdır. Bu, inStream nesnesinin çöpü yıllık değişkenin içine bırakır çünkü bu, yalnızca içeriğinin yok edilmiş olduğu dosyaya işaret eder. Bu yüzden tuhaf numaraların.

InStream'de dosyayı açın ve içeriği okuyun, kapatın, sonra outStream'i açın ve yazın. Bu sorunu çözmeli, ancak dosya içeriğini açmadan ve yok etmeden önce işlem sırasında herhangi bir sorun oluşmamasını sağlamak en iyisidir. Eğer yapmazsanız, bir hatayla karşılaşabilir ve dosyada hiçbir şey kalmazsınız. Temel olarak, önceki içeriği yok etmeden önce yazmak için iyi bir veriye sahip olduğunuzdan emin olun.

ne yaptığınızı dosyayı yok ettiğini göstermek için:

#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

Hayır, bu 'ios :: trunc' –

+0

Evet, ios :: trunc dosyayı kırpmak, ancak ios :: out yapar. Dene. –

+0

'ios :: in | ios :: out' dosyayı kırpmıyor. 'ios :: trunc' tek başına geçerli bir açık mod değildir. – Potatoswatter

6

akışı sınıfları (kuyu, teknik olarak bu durumda basic_filebuf sınıf olarak) önbelleğe okur ve o dosyaya yazar vardır. Farklı dosya akışlarının senkronize edilmesi garanti edilmez.

Dosyaya iki ayrı akış yerine tek bir fstream kullanın.