C++相談室 part166 (569レス)
上下前次1-新
抽出解除 レス栞
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
325(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ f532-iKku) [sage] 2025/06/17(火) 12:02:37.80 ID:nCRyYLZZ0(3/3) AAS
>>321321(3): デフォルトの名無しさん (ワッチョイ b1d6-xkro) [sage] 2025/06/17(火) 11:13:00.43 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;
}
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;
}
実際に入出力するための機能はストリームバッファと呼ばれるオブジェクトが担当していて、ストリームがストリームバッファを所有する構造になっている。
ストリームが close するとストリームバッファの close が呼ばれて、それが nullptr を返した場合 (クローズに失敗した場合) に setstate(failbit) が呼ばれる。
外部リンク:timsong-cpp.github.io
つまり、クローズの失敗によってもフェイルビットが立つことはありうる。
クローズによらない失敗 (フェイルビットを立てる原因) と区別がつかなくなるのでエラーに対処したいならクローズ前後の両方でチェックしないといけないと思う。
デストラクタでクローズするとクローズの失敗に対処する機会がなくなるので明示的にクローズしたほうが良いという人はいる。
ただ、しっかりしたホスト環境の上で動くアプリケーションでクローズが失敗するような状況を心配する意味があるかというと……まああんまりない。
346: デフォルトの名無しさん (ワッチョイ f6c4-dilZ) [sage] 2025/06/19(木) 14:04:16.80 ID:ytoOjILn0(4/4) AAS
しったなすんなジジイ
397: デフォルトの名無しさん (アウアウウー Sacd-xHx3) [sage] 2025/06/20(金) 11:14:53.80 ID:xCnXC/Iza(1/2) AAS
>>396396(2): デフォルトの名無しさん [sage] 2025/06/20(金) 10:45:39.27 ID:4xHX9xY70(1/2) AAS
>>392
ここまでの話で「定数だけの演算なら」と何で言い出すのか理解できないけど
>>375では「整数型の変数を」と言っているわけだし
まあそれはおいておいても「コンパイルの時点で計算しても」←演算してんじゃんって俺は思うわけ
>>393
それ自体は問題なくね?
157 を 10で割って15
これに10を掛けるのでなく15*8+15+2 でも最適化の影響はないだろ?
割り算の方でそれが起きるなら問題だけど、>>378の人の話では起きないようだけど
これ観たら発狂するんじゃね
外部リンク:qiita.com
外部リンク:qiita.com
外部リンク:qiita.com
479: はちみつ餃子◆8X2XSCHEME (ワッチョイ 8d32-RyDx) [sage] 2025/06/28(土) 15:55:10.80 ID:mCCHdrx+0(1/4) AAS
C++23 では「そのような型があるなら std::float128_t として提供されることもある」というオプショナルなもので、あまりあてにならない。
外部リンク[fp]:timsong-cpp.github.io
ハードウェアとかツールチェインとかの都合もあるだろうし。
524: デフォルトの名無しさん (ワッチョイ ffa1-BzvG) [sage] 2025/07/06(日) 06:14:16.80 ID:B20RUTJT0(1/9) AAS
質問なのですが
ケースA) std::stringstream ist("A B"); char c1, c2, c3; に対し、ist >> c1; ist >> c2; ist >> c3; とすると
ist >> c2 は正常に読めて、ist >> c3 を実施した時点で!ist.good()かつist.eof() となってgetc()と類似のEOF検知挙動なのですが
(ちなみに読み取った文字は c1='A'、c2='B'。c3の読み取りは行われない
ケースB) std::stringstream ist("A B"); std::string s1, s2, s3; に対し、ist >> s1; ist >> s2; ist >> s3; とすると
ist >> s2 を実施した時点で早々に!ist.good()かつist.eof() となって挙動が相違し
(ちなみに読み取った文字列は s1="A"、s2="B"。s3の読み取りは行われない
ケースC) しかしBの後に空白を追加してstd::stringstream ist("A B "); とすると、
ist >> s2 は正常に読めて、ist >> s3 を実施した時点で!ist.good()かつist.eof() となってgetc()と類似のEOF検知挙動になる
(ちなみに読み取った文字列は s1="A"、s2="B"。s3の読み取りは行われない
となってケースB)とケースC)で共通に使えるような最終要素まで読み取り完了判定ロジックが無く
std::istream神話が崩壊したんだけどこれっておま環?
一体どうすれば……orz
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.028s