RAII文件句柄看起來很基本,所以我猜它已經實現了?但是我找不到任何實現。我在boost :: iostreams中找到了file_descriptor,但是我不知道它是我想要的。是否有任何RAII文件句柄已經實現?
4
A
回答
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()
之前,但再次閱讀文檔後:
在情況下的對象在與打開的文件關聯時被銷燬,析構函數會自動調用成員函數關閉。
所以,這是安全的:)
相關問題
- 1. 是否已使用FILE_FLAG_SEQUENTIAL_SCAN標誌打開文件句柄?
- 2. 是否有任何已經建立的BDD的軟件包
- 3. 有沒有辦法檢查(文件)句柄是否有效?
- 4. 是否有任何MVVM庫實現CommandSinkBinding?
- 5. C中是否有任何NFS實現?
- 6. 如何檢查文件句柄是否仍然指向文件
- 7. php布爾語句來檢查文件是否已經上傳
- 8. 使用NamedPipe時,是否有任何方法檢測客戶端管道的句柄是否已關閉?
- 9. 如何判斷文件句柄是否是套接字?
- 10. 檢查文件是否已經打開
- 11. 是否有文件名或句柄寫入控制檯?
- 12. 如何通過Codedom實現「句柄」
- 13. 任務並行庫文件句柄
- 14. 檢查是否有任何格式已經在頁
- 15. C++/CLI如何判斷句柄是否指向任何對象
- 16. 是否有任何實際的Android手機實現藍牙spp配置文件
- 17. 檢查文件是否被進程文件句柄鎖定
- 18. 是否有平面文件JDO實現?
- 19. 檢查,看是否任擇議定書方法已經實施
- 20. 「句柄」的使用是否有助於防止出現「System.InvalidCastException」?
- 21. 文件句柄選項不會出現
- 22. RegOpenCurrentUser句柄沒有收到任何值
- 23. 是否有任何c編譯器實現任何C1X功能?
- 24. 如何關閉C#中現有的文件句柄#
- 25. 檢查matlab句柄是否是數字句柄
- 26. 是否有任何基於文本的進度條實現?
- 27. 是否有java/clojure的任何條件重啓庫實現?
- 28. 是否有任何已知的HTA文件安全問題?
- 29. Scala的「if ... else」是否已經作爲庫函數實現?
- 30. 如何檢測是否有已經用opencv簽名的任意文檔
文件句柄太舊風格中,然後從C++大師吸引眼球。儘管我和你在一起。 –
你找不到'std :: fstream'? – DevSolar
@MarkRansom文件句柄是OS原語,不是「舊式C」的東西。 –