1

IOストリームが本当に移植可能かどうか疑問に思っていました(そうあるべきだと思いますが、確実にしたいです)?特に、UNIXとWindowsの両方で使用されるファイルを処理する場合。

具体的には、Windowsのファイルにdouble値をダンプし、iostreamを使用してファイルからunixで同じ値を読み取った場合、2つのオペレーティングシステムのエンディアンが異なるため、問題は発生しませんか?

フォーマットされたioはどうですか?フォーマットされたデータを操作することになると、windowsとunixが同じものを処理する方法にいくつかの違いがあることをどこかで読みましたが、どこにあるのかわかりません。誰かがこの問題に光を当てることができますか?

4

3 に答える 3

2

C++ 標準は抽象的であり、特定の OS (AFAIK) について言及していません。したがって、iostream ライブラリは移植可能です。そうは言っても、C++ 標準では、ユーザーに表示される (標準の C++ ライブラリに隠されているだけでなく) 一部を含む、特定の実装の詳細を実装に依存させることができます。これにより、OS やコンパイラのプロバイダーは、C++ 標準を実装するための優先する方法を選択できます。

実装依存の動作に依存するコードは、同じ OS やコンパイラの異なるバージョン内であっても、明らかに移植性がありません。言い換えれば、そのようなコードは避けるべきです。

注: 実装に依存するコードを記述する必要がある場合があります。この場合、仮定された実装依存の動作を壊さないようにコードを保護することが不可欠です。たとえば、プログラムはsizeof(long unsigned)==8. この場合、少なくともstatic_assert(sizeof(long unsigned)==8,"long unsigned not 8 bytes")無効なコードのコンパイルを停止する必要がありますが、理想的には代替バージョンが存在し、代わりにテンプレート マジック (または C スタイル マクロ) を使用して選択する必要があります。C++11 標準では、このような問題を回避するために、保証された(および同様の)型std::uint64_tを実際に提供しています。ただし、実装依存のままです。 sizeof(std::uint64_t)==8sizeof(ostream)

于 2012-10-15T14:24:37.960 に答える
1

あるシステムから特定のバイトシーケンスを書き込み、そのシーケンスを別のシステムに転送する場合(ファイルまたはソケットで、実際には問題ではありません)、同じバイトシーケンスを読み戻すことができる範囲で移植可能です。向こう側。バイナリモードではなくテキストモードで書き込みまたは読み取りを行う場合、行末(および理論的には他の実装定義の特殊文字)が再解釈される可能性があります。

移植性がないのは、バイナリまたはフォーマットさdoubleれたバイトのシーケンスとしての正確な表現です。たとえばエンディアンのためにバイナリであり、ランタイムライブラリの微妙な違いのためにフォーマットされているため、あるシステムで文字列にエンコードしたり、別のシステムで文字列にエンコードしたりすると、結果がulp(または場合によってはそれ以上)異なる可能性があります。十分な10進数の精度である必要があるものを出力します。NaN値の文字列表現も実装に任されています。double

C ++標準に関する限り、doubleIEEE倍精度値である必要はありません。したがって、理論的には、バイナリ表現間に共通点はなく、どの値を表現できるか、したがってフォーマットされたI/Oを実行するときにどの文字列が出力/受け入れられるかという点でも大きな違いがあります。実際には、IEEEが一般的に使用されており、文字列は通常、浮動小数点演算で予想される以上のエラーを引き起こしません。

于 2012-10-15T15:24:51.773 に答える
1

ファイル入出力: はい、互換性があります。Unix のビット ストリームは、Windows のビット ストリームと同じです。UNIX の double 値は Windows と同じで、どちらも標準に従っています。

フォーマット: バイナリ フォーマット (double の例) については知りませんが、テキストについて話している可能性があります。Windows でのテキストの書式設定は Unix とは異なり、これが多くの問題の原因となっています。

バイナリ インターフェイス / コードの移植性 : IO に関数を使用している場合、移植性がありません。std::input/output ストリーム、つまり f/o/stream の実装は移植性がなく、移植性を考慮して設計されていません。

于 2012-10-15T13:49:47.320 に答える