Đây là dấu vết của các cuộc gọi từ tài liệu:
void std::basic_ofstream::close();
hiệu quả gọi rdbuf()->close()
. Nếu xảy ra lỗi trong khi hoạt động, hãy gọi setstate(failbit)
.
std::basic_streambuf<CharT,Traits>* std::basic_ofstream::rdbuf() const;
Trả về đệm dòng liên quan. Nếu không có bộ đệm luồng liên quan, trả về NULL
.
std::basic_streambuf
thực sự thừa hưởng std::basic_filebuf
, do đó:
std::basic_filebuf<CharT, Traits>* std::basic_filebuf::close();
Nếu một khu vực đặt tồn tại (ví dụ như tập tin đã được mở ra cho văn bản), các cuộc gọi đầu tiên overflow(Traits::eof())
để viết tất cả các đầu ra cấp phát đến tập tin, bao gồm bất kỳ trình tự unshift nào.
Nếu thời gian gần đây được gọi là hầu hết các chức năng, trong số underflow()
, overflow()
, seekpos()
, và seekoff()
, là overflow()
, sau đó gọi std::codecvt::unshift()
, có lẽ nhiều lần, để xác định trình tự unshift theo locale thấm nhuần, và viết rằng chuỗi nộp với overflow(Traits::eof())
.
Sau đó, đóng tệp như thể bằng cách gọi std::fclose
, bất kể có bất kỳ cuộc gọi nào trước đó đã thành công hay không thành công.
LƯU Ý:.close()
thường được gọi là thông qua các destructor của std::basic_filebuf
(trong đó, lần lượt, thường được gọi bằng destructor của std::basic_fstream
Trước hết, chúng ta có thể thấy rằng nó doesn' t thực sự gọi trực tiếp flush()
như bạn mong đợi, tuy nhiên, hiệu ứng đỏ bừng thực sự xảy ra theo phương pháp std::basic_filebuf::close()
. Ngoài ra, chúng ta có thể thấy rằng nó vẫn làm xáo trộn một tệp, ví dụ như viết trình tự unshift. xảy ra sau đó, tệp đơn giản đóng.
Chú ý đến LƯU Ý ở trên: trong hầu hết các trường hợp, bạn thậm chí không cần gọi số std::basic_ofstream::close()
một cách rõ ràng.
Tôi đã lặp lại câu hỏi của mình, vui lòng xem bản chỉnh sửa của bài đăng gốc. – NPS