2014-04-01 68 views
4

RAII文件句柄看起來很基本,所以我猜它已經實現了?但是我找不到任何實現。我在boost :: iostreams中找到了file_descriptor,但是我不知道它是我想要的。是否有任何RAII文件句柄已經實現?

+1

文件句柄太舊風格中,然後從C++大師吸引眼球。儘管我和你在一起。 –

+0

你找不到'std :: fstream'? – DevSolar

+0

@MarkRansom文件句柄是OS原語,不是「舊式C」的東西。 –

回答

5

std::fstream支持RAII風格的用法 - 它們可以在構造時打開甚至測試,並且它們會在析構函數中自動刷新並關閉,但如果您只是假設那些工作可能會失敗,如果您需要強大的功能,請在代碼中更明確地進行操作。

例如:

if (std::ifstream input(filename)) 
    ... use input... 
else 
    std::cerr << "unable to open '" << filename << "'\n"; 

如果你真的想用文件描述符,你可以調整類似以下的味道。這比東西,只是調用close長了一點,但如果你想要做強大的編程,你需要檢查並以某種方式處理錯誤....

struct Descriptor 
{ 
    Descriptor(int fd, const char* filename = nullptr) 
     : fd_(fd), filename_(filename) 
    { 
     if (fd < 0) 
     { 
      std::ostringstream oss; 
      oss << "failed to open file"; 
      if (filename_) oss << " '" << filename_ << '\''; 
      oss << ": " << strerror(errno); 
      throw std::runtime_error(oss.str()); 
     } 
    } 
    ~Descriptor() 
    { 
     if (fd_ != -1 && close(fd_) == -1) 
     { 
      // throwing from destructors risks termination - avoid... 
      std::cerr << "failed to close file"; 
      if (filename_) std::cerr << " '" << filename_ << '\''; 
      std::cerr << ": " << strerror(errno) << std::endl; 
     } 
    } 
    operator int() const { return fd_; } 

    private: 
    int fd_; 
}; 

用法:

try 
{ 
    Descriptor fd(open(filename, O_RDONLY), filename); 
    int nbytes = read(fd, ...); 
    ... 
} 
catch ... 
0

取決於你究竟想要什麼。

如果你真的想要一個範圍的手柄,使用方法:

std::unique_pointer<HANDLETYPE, closehandletypefunction> smartpointer; 

的首選C++的方式被包裹在手柄的對象與成千上萬的會員做雖然一切。

0

我正在使用boost::filesystem::ifstream(或ofstream進行書寫)。

實際上,我是問這個,因爲我想,以確保即使一個異常升高我的文件被關閉調用file.close()

之前,但再次閱讀文檔後:

在情況下的對象在與打開的文件關聯時被銷燬,析構函數會自動調用成員函數關閉。

所以,這是安全的:)

相關問題