2010-02-26 30 views
11

Tôi đang sử dụng MacOSX.C++ std :: ofstream flush() nhưng không đóng()

Trong phần đăng nhập của ứng dụng, tôi đang đổ dữ liệu vào một tệp.

cho rằng tôi có một tuyên bố trên toàn cầu std::ofstream outFile("log");

và mã đăng nhập của tôi, tôi có:

outFile << "......." ; 
outFile.flush(); 

Bây giờ, giả sử treo mã của tôi sau khi flush() xảy ra; Là những thứ được viết cho outFile trước khi flush() đảm bảo được ghi vào đĩa (lưu ý rằng tôi không gọi số close()).

Cảm ơn!

+0

'outFile <<" ....... "<< std :: flush;' là mã dễ đọc hơn. –

Trả lời

11

Từ quan điểm thời gian chạy của C++, nó phải được ghi vào đĩa. Từ góc độ hệ điều hành, nó vẫn có thể nằm trong bộ đệm, nhưng đó chỉ là vấn đề nếu toàn bộ máy của bạn bị treo.

2

flush() xóa bộ đệm của thư viện iostream - tuy nhiên dữ liệu gần như không được xả ngay lập tức từ bộ đệm của hệ điều hành cùng lúc, vì vậy có một khoảng thời gian ngắn trong đó hệ điều hành bị lỗi. . Tất nhiên, bạn có thể mất dữ liệu bất cứ lúc nào nếu bạn bị lỗi đĩa cứng, cho dù dữ liệu đã được viết hay chưa, vì vậy tôi sẽ không lo lắng quá nhiều về điều này.

0

Miễn là flush() đã trở lại, chương trình của bạn đã đặt thành công đầu ra trong tay của hệ điều hành. Trừ khi hệ điều hành (hoặc đĩa) bị treo, dữ liệu của bạn sẽ được ghi vào đĩa vào lần tới khi đĩa ghi (lưu ý rằng đĩa có thể có bộ nhớ cache trạng thái rắn).

Cho đến khi trở về tuôn ra(), có ai đó đoán số tiền sẽ được đưa vào đĩa.

6

Là một cách tiếp cận khác, bạn có thể vô hiệu hóa hoàn toàn đệm với

outFile.rdbuf()->pubsetbuf(0, 0); 

Viết một unbuffered fstream thể làm tổn thương thực hiện, nhưng lo lắng về điều đó trước khi đo sẽ được tối ưu hóa quá sớm.

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