C++相談室 part166 (569レス)
C++相談室 part166 http://mevius.5ch.net/test/read.cgi/tech/1745631298/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
321: デフォルトの名無しさん (ワッチョイ b1d6-xkro) [sage] 2025/06/17(火) 11:13:00.43 ID:4NySVCEQ0 ファイナルをクローズした時にエラーとなるのですが、これは正しいのでしょうか。 やはり、クローズはデストラクタに任せた方がいいのでしょうか。 #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; } std::string buf; while(std::getline(ifs, buf)) std::cout << buf << std::endl; ifs.close(); //←これ if(ifs.fail()){ std::cerr << "File close error: " << path << std::endl; return -1; } return 0; } http://mevius.5ch.net/test/read.cgi/tech/1745631298/321
322: デフォルトの名無しさん (ワッチョイ 8101-1tcn) [sage] 2025/06/17(火) 11:27:27.12 ID:2aAnRxo/0 >>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; } std::string buf; std::cout << "0: " << ifs.fail() << '\n'; while(std::getline(ifs, buf)) std::cout << buf << std::endl; std::cout << "1: " << ifs.fail() << '\n'; ifs.close(); //←これ std::cout << "2: " << ifs.fail() << '\n'; if(ifs.fail()){ std::cerr << "File close error: " << path << std::endl; return -1; } return 0; } http://mevius.5ch.net/test/read.cgi/tech/1745631298/322
324: デフォルトの名無しさん (ワッチョイ 5e0b-AFj/) [sage] 2025/06/17(火) 11:45:37.82 ID:TpERKz9s0 >>321 close()したからではなくwhile(std::getline(ifs, buf))でeofになるまで読んだからfailになってる http://mevius.5ch.net/test/read.cgi/tech/1745631298/324
325: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f532-iKku) [sage] 2025/06/17(火) 12:02:37.80 ID:nCRyYLZZ0 >>321 実際に入出力するための機能はストリームバッファと呼ばれるオブジェクトが担当していて、ストリームがストリームバッファを所有する構造になっている。 ストリームが close するとストリームバッファの close が呼ばれて、それが nullptr を返した場合 (クローズに失敗した場合) に setstate(failbit) が呼ばれる。 https://timsong-cpp.github.io/cppwp/n3337/ifstream.members#5 つまり、クローズの失敗によってもフェイルビットが立つことはありうる。 クローズによらない失敗 (フェイルビットを立てる原因) と区別がつかなくなるのでエラーに対処したいならクローズ前後の両方でチェックしないといけないと思う。 デストラクタでクローズするとクローズの失敗に対処する機会がなくなるので明示的にクローズしたほうが良いという人はいる。 ただ、しっかりしたホスト環境の上で動くアプリケーションでクローズが失敗するような状況を心配する意味があるかというと……まああんまりない。 http://mevius.5ch.net/test/read.cgi/tech/1745631298/325
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
1.247s*