2010-01-26 38 views
13

Tôi có đoạn mã sau và nó hoạt động khá tốt (khác với thực tế là nó khá chậm, nhưng tôi không quan tâm nhiều về điều đó). Nó không có vẻ trực quan mà điều này sẽ viết toàn bộ nội dung của các infile để outfile.Ifstream :: rdbuf() thực sự làm gì?

// 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; 
} 

Có thông tin chi tiết nào không?

+1

Tôi sẽ thêm lệnh gọi rõ ràng đó vào 'close()' không cần thiết. Destructor sẽ làm như vậy anyway. Và điều đó tiết kiệm một số dòng. ;) –

Trả lời

12

Có, nó được chỉ định trong tiêu chuẩn và nó thực sự khá đơn giản. rdbuf() chỉ trả về một con trỏ đến đối tượng cơ bản basic_streambuf cho đối tượng [io]stream nhất định.

basic_ostream<...> có quá tải cho operator<< cho con trỏ đến basic_streambuf<...> ghi nội dung của basic_streambuf<...>.

+2

Nhưng không phải toán tử << chỉ viết ra một đoạn? Nó không phải dễ dàng để thấy rằng nó sẽ viết ra toàn bộ điều như một đoạn. Tôi hiểu đó là một con trỏ đến nó nhưng con trỏ đó có chứa toàn bộ dữ liệu như một đoạn không? Tôi vẫn còn chút bối rối. –

+3

Tôi không chắc chắn những gì bạn đang lái xe với 'một đoạn'? Nó được chỉ định để xuất nội dung của ký tự 'trỏ tới 'streambuf' theo ký tự cho đến khi kết thúc bộ đệm đạt hoặc có lỗi xuất ra. 'Streambuf' là một cá thể lớp và cho dù nó lưu trữ chuỗi được kiểm soát của nó trong bộ nhớ liền kề hay không thì không được chỉ định và không thể suy ra từ giao diện. –

+0

Ok, nó sẽ nhân vật theo ký tự cho đến khi kết thúc bộ đệm đạt được. Làm sao bạn biết điều đó? Tôi không thấy điều đó từ giao diện được cung cấp. –

15

iostream các lớp chỉ là trình bao bọc xung quanh bộ đệm I/O. Bản thân số iostream không thực hiện được nhiều ... chủ yếu, nó cung cấp các toán tử định dạng operator>>. Bộ đệm được cung cấp bởi một đối tượng có nguồn gốc từ basic_streambuf, mà bạn có thể nhận và đặt bằng cách sử dụng rdbuf().

basic_streambuf là cơ sở trừu tượng với một số chức năng ảo được ghi đè để cung cấp giao diện đồng nhất cho các tệp đọc/ghi, chuỗi, v.v. Hàm basic_ostream<…>::operator<<(basic_streambuf<…>) được định nghĩa để tiếp tục đọc qua bộ đệm cho đến khi nguồn dữ liệu cơ bản là kiệt sức.

iostream là một mớ hỗn độn khủng khiếp.

+0

Tôi đồng ý, và đây là một câu trả lời hay nhưng Charles đã gửi câu trả lời của anh ấy đầu tiên để anh ấy là người chiến thắng. Tôi lên bình chọn câu trả lời của bạn mặc dù! –

Các vấn đề liên quan