C++相談室 part166 (569レス)
前次1-
抽出解除 レス栞

321
(3): (ワッチョイ b1d6-xkro) 06/17(火)11:13 ID:4NySVCEQ0(1/2) AAS
ファイナルをクローズした時にエラーとなるのですが、これは正しいのでしょうか。
やはり、クローズはデストラクタに任せた方がいいのでしょうか。

#include <iostream>
#include <fstream>
int main() {
constexpr auto path = "tmp.txt";//なんでもいいです
std::ifstream ifs(path);
if(ifs.fail()){
std::cerr << "File open error: " << path << std::endl;
return -1;
省11
322
(1): (ワッチョイ 8101-1tcn) 06/17(火)11:27 ID:2aAnRxo/0(1) AAS
>>321
ifs.close()前にifs.fail()は真を返す

#include <iostream>
#include <fstream>
int main() {
constexpr auto path = "tmp.txt";//なんでもいいです
std::ifstream ifs(path);
if(ifs.fail()){
std::cerr << "File open error: " << path << std::endl;
return -1;
省14
324
(1): (ワッチョイ 5e0b-AFj/) 06/17(火)11:45 ID:TpERKz9s0(1) AAS
>>321
close()したからではなくwhile(std::getline(ifs, buf))でeofになるまで読んだからfailになってる
325
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ f532-iKku) 06/17(火)12:02 ID:nCRyYLZZ0(3/3) AAS
>>321
実際に入出力するための機能はストリームバッファと呼ばれるオブジェクトが担当していて、ストリームがストリームバッファを所有する構造になっている。
ストリームが close するとストリームバッファの close が呼ばれて、それが nullptr を返した場合 (クローズに失敗した場合) に setstate(failbit) が呼ばれる。
外部リンク:timsong-cpp.github.io
つまり、クローズの失敗によってもフェイルビットが立つことはありうる。

クローズによらない失敗 (フェイルビットを立てる原因) と区別がつかなくなるのでエラーに対処したいならクローズ前後の両方でチェックしないといけないと思う。

デストラクタでクローズするとクローズの失敗に対処する機会がなくなるので明示的にクローズしたほうが良いという人はいる。
ただ、しっかりしたホスト環境の上で動くアプリケーションでクローズが失敗するような状況を心配する意味があるかというと……まああんまりない。
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.031s