2015-10-09 16 views
12

Nếu tôi có std::ofstream có thể có hoặc chưa được mở, có an toàn không để thử close bất kể? Trong các từ khác làm close() làm bất cứ điều gì khó chịu (ném ngoại lệ, vv) nếu !is_open(). Ví dụBạn có thể đóng một tệp an toàn chưa từng được mở một cách an toàn không?

std::ofstream out; 
if (some_condition) 
{ 
    out.open(path, std::ios::out); 
} 

Sau khi tôi đang thực hiện với các tập tin, có thể tôi chỉ nói

out.close(); 

Hoặc tôi nên kiểm tra đầu tiên

if (out.is_open()) 
    out.close(); 

Mô tả duy nhất của std::basic_fstream::close trên cppreference là

Đóng assoc tập tin đính kèm.
Gọi hiệu quả rdbuf()->close(). Nếu xảy ra lỗi trong khi hoạt động, hãy gọi setstate(failbit).

+2

Bạn chỉ có thể để đối tượng nằm ngoài phạm vi ... –

+1

Nói chung đó là những gì tôi làm, đó là lý do tại sao tôi thích 'std :: ofstream', nhưng trong trường hợp cụ thể này, tôi muốn tệp bị đóng trước đó hơn là nếu không. – CoryKramer

+2

Nếu bạn nhìn vào cppreference cho ['std :: ofstream :: close'] (http://www.cplusplus.com/reference/fstream/ofstream/close/), bạn sẽ thấy rằng ví dụ cụ thể về việc gọi' close 'trên một tập tin không mở được sử dụng. Tóm lại, không có gì khó chịu xảy ra, nó chỉ thiết lập các failbit vì vậy bất cứ điều gì bạn cố gắng làm với 'ofstream' sau đó có thể gây ra vấn đề. –

Trả lời

14

Nó thực hiện chính xác những gì cppreference cho biết sẽ: các failbit sẽ được thiết lập, và bạn có thể kiểm tra nó với các phương pháp thất bại(). Ví dụ, các bản in sau "thất bại \ n":

#include <iostream> 
#include <fstream> 
int main(int argc, char ** argv) 
{ 
     std::ofstream out; 
     out.close(); 
     if (out.fail()) 
       std::cout << "fail" << std::endl; 
     return 0; 
} 

Xét về tương tác với hệ điều hành, không có gì đó để đóng là, nhưng nó vô hại.

8

Từ tiêu chuẩn C++, § 27.9.1.4 [filebuf.members], đoạn 6:

basic_filebuf<charT,traits>* close();
    Effects:. Nếu is_open() == false, trả về một null pointer & hellip;

6

Có, bạn có thể close() tệp luôn, ngay cả khi tệp không được mở. Không có vấn đề LINUX hoặc Windows, tôi luôn luôn close() mà không nghĩ rằng chúng được mở hay không.

Từ LINUX:

void 
close() 
{ 
    if (!_M_filebuf.close()) 
     this->setstate(ios_base::failbit); 
} 
+0

"Từ LINUX" bạn có nghĩa là libstdc + +? – edmz

+0

có. Thụt lề có dây vì libstdC++ được định dạng giống như –

+3

Linux và Windows không có liên quan gì đến nó. Câu hỏi đặt ra là về C++. – EJP

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