2010-01-26 22 views
13

Aşağıdaki kodum var ve oldukça iyi çalışıyor (oldukça yavaş olduğu gerçeğinden başka, ama bununla ilgili pek umurumda değil). Bu, sezginin tüm içeriğini dış dosyaya yazacak kadar sezgisel görünmüyor.ifstream :: rdbuf() aslında ne yapar?

// Returns 1 if failed and 0 if successful 
int WriteFileContentsToNewFile(string inFilename, string outFilename) 
{ 
    ifstream infile(inFilename.c_str(), ios::binary); 
    ofstream outfile(outFilename.c_str(), ios::binary); 

    if(infile.is_open() && outfile.is_open() && infile.good() && outfile.good()) 
    { 
     outfile << infile.rdbuf(); 

     outfile.close(); 
     infile.close(); 
    } 
    else 
     return 1; 

    return 0; 
} 

Herhangi bir fikir?

+1

Bu açık çağrıları, 'close()' gerektirmezse ekleyebilirim. Yıkıcılar yine de aynısını yapardı. Ve bu da bazı satırları kaydeder. ;) –

cevap

12

Evet, standartta belirtildi ve aslında oldukça basit. rdbuf(), yalnızca verilen [io]stream nesnesinin temelindeki basic_streambuf nesnesine bir işaretçi döndürür.

basic_ostream<...>basic_streambuf<...> içeriğine yazar basic_streambuf<...> gösteren bir işaretçi için operator<< için bir aşırı sahiptir.

+2

Ama operatör değil << sadece bir yığın yazmak? Her şeyi bir yığın olarak yazacağını görmek kolay değil. Anladığım kadarıyla, bu işaretçi tüm veriyi tek bir yığın olarak içeriyor mu? Hala biraz kafam karıştı. –

+3

'Tek parça' ile ne sürdüğünüzden emin değilim? Tamponun sonuna ulaşılana kadar "streambuf" karakterinin içerdiği karakterlerin çıktısı çıktığında ya da çıktısında bir hata oluştuğunda belirtilir. "Streambuf" bir sınıf örneğidir ve kontrollu sırasını bitişik bellekte depolayıp saklamayacağı belirtilmez ve arabirimden çıkarılamaz. –

+0

Tamam, arabelleğin sonuna ulaşılana kadar karakter karakterli yapar. Bunu nasıl biliyorsun? Bunu sağlanan arayüzden görmedim. –

15

iostream sınıfları, yalnızca I/O arabellekleri etrafındaki paketleyicidir. iostream'un kendisi çok fazla bir şey yapmaz… esas olarak, operator>> formatlama işleçleri sağlar. Tampon, rdbuf() kullanarak alabileceğiniz ve ayarlayabileceğiniz basic_streambuf'dan türetilen bir nesne tarafından sağlanır.

basic_streambuf

/okuma dosyalar, ipler, yazma için tek tip bir arayüz sağlamak için geçersiz kılınmış olan sanal fonksiyonların sayısına sahip olan bir soyut temel vb fonksiyonu basic_ostream<…>::operator<<(basic_streambuf<…>) temel veri kaynağı kadar tampon ile okumaya devam tanımlanır yorgun. Yine de, berbat bir karmaşadır.

+0

Katılıyorum ve bu iyi bir cevap ama Charles önce cevabını verdi, böylece kazanan oldu. Yine de cevabınızı oyladım! –