質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2261閲覧

C++ istreamがios::binaryでオープンされているかどうか調べたい

Chironian

総合スコア23272

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/02/29 01:40

こんにちは。

std::istreamの参照を受取るクラスを書いているのですが、バイナリー・モードでオープンすることを、ユーザに強制したいと考えています。
渡されたものがstringstreamなら問題ない筈ですが、ifstreamの時は間違ってデフォルトのテキスト・モードでオープンされているとストリーム中の0x1AでEOFが発生し、頭が痛いのです。先ほどやってしまって無駄な苦労しました。

そこで、テキスト・モードでオープンされたistreamが渡されたらエラーにしたいのですが、方法ないでしょうか?
標準ライブラリ自身は把握している筈なので何かあると思うのですが、見つからなくて困ってます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

私も昔、これとほとんど同じ問題を研究したことがありますが、結論は「標準的な方法は存在しない」でした。

オープンモードはOS固有のものであり、Unix、Windows、Linuxなどで「テキストファイル」の扱いが異なることに由来します。推察ですが、取得方法が存在しないのは、下記の理由に依るのだと思います。

・ファイルを一度開いてしまえばモードをオブジェクト自身が知っている必要はない。
・ファイルとistreamオブジェクトの結び付けの後にモード切替ができる場合があり、監視コストがかかる。
(istreamは標準入出力が対応する場合もあるため)

次に、FILE*型やハンドルを取得する方法も試してみたのですが、これも上手くいきませんでした。
下記に参考となるStackOverFlowの記事を引用してあります。
http://stackoverflow.com/questions/109449/getting-a-file-from-a-stdfstream

以上のことから、私は、「標準的な方法は存在しない」という結論をとりました。

投稿2016/02/29 02:21

majiponi

総合スコア1720

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chironian

2016/02/29 02:49

回答ありがとうございます。 深く調べた結果、ないのであればなさそうですね。 でも、僅かな望みにかけて、今しばらく回答募集させて下さい。 ios::inとios::outは取れるようなのですよ。これらもOSから取れるとは限らないように思いますので、どこかで保持している筈です。そこに一緒に入れる仕様が規格にこっそり追加されてないかなとか甘い期待をしています。同じopenmodeですし。 しかし、ios::binary自体、MS-DOS時代から引っ張るテレタイプ用の"\r\n"対応ですもんね。互換性の維持のためとはいえ、未だにその悪夢に悩まされるって悲しいかも。
majiponi

2016/02/29 04:27

> ios::inとios::outは取れるようなのですよ。 それは知りませんでした、ちょっと規格書と照らし合わせてみたいので、方法を教えてください。
Chironian

2016/02/29 06:57 編集

std::streambuf::seekoff()にopenmodeのios::inかios::outが渡されるようです。 この関数は恐らく、std::istream::seekg()関数を呼ぶと呼ばれるのだと思いますが、seekg()にopenmodeは指定しませんから、istreamが保持しているのではないかと推測してます。 【追記】 あああ、違いました。seekg()とseekp()で切り替えているのですね。見落としてました。 ってことは、in, outも保持してないですね。ならば無理か。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問