2012-01-08 32 views
2

ハフマンエンコーダを作成しようとしていますが、圧縮エラーが発生しています。私は問題を、ストリームにput()された文字と同じファイルからread()文字との間の不一致と特定しました。この問題の文字の読み込みと読み込みの不一致

一つの特定のインスタンス:

  • プット()ASCII文字10(改行)
  • )は(読み取り書き込みASCII文字13(キャリッジリターン)

を読み込み私は読んで考えて、生データ(文字の翻訳なし)を読み書きしました。なぜこれが起こっているのか分かりません。誰かが私を助けることができますか?コードは、Windows 7上で動作していると、プログラム内のすべてのストリームされているのと同じ

std::ifstream fileInput(getFileName()+".huf",std::ios::binary); 

を読み取るため

std::ofstream compressedFileStream(getCompressedFileName(),std::ios::binary||std::ios::ate); 

とはifstreamインスタンス:ここ

は、圧縮ファイルを作成するためのofstreamのインスタンスでありますバイナリモードで開きます。

+0

お使いのオペレーティングシステムは何ですか? –

+0

'ofstream'インスタンスを開くコードを投稿できますか? – hmjd

+0

@ Mr.TAMER私はWindows 7にいる – angryInsomniac

答えて

5

が原因タイプミスにバイナリモードで開かれていない:

std::ofstream compressedFileStream(getCompressedFileName(),std::ios::binary||std::ios::ate) 

は次のようになります。

std::ofstream compressedFileStream(getCompressedFileName(),std::ios::binary|std::ios::ate) 
                     // ^

|、ない||

+0

まあ...今私は愚かな気がしないでください! :) – angryInsomniac

3

テキストモードでofsteamを作成しているか、テキストモードで開いているfiledescを使用して作成していることがわかります。 構築時にios :: binaryを渡すか、Windows上でテキストモードで実行することができます。

コードを追加した後、その理由は誤字であることが判明しています。

std::ios::binary||std::ios::ate 

は、あなたがバイナリデータを作成している場合、あなたは適切な属性を持つファイルを開く必要があり、Windows上で

std::ios::binary|std::ios::ate 
0

でなければなりません。

同様に、バイナリデータを読み込んでいる場合は、適切な属性でファイルを開く必要があります。

+0

私のすべてのストリームはバイナリモードです。 – angryInsomniac

+1

いいえ - そうではありません。あるいは、私は実際にコードを見ることができないので、「両方ともバイナリストリームであれば、非常に、非常に驚​​くだろう」としましょう。両方ともバイナリであれば、CRをLFマッピングにすることはできません。問題は出力ストリームにある可能性が高いと思います。 Windows上のテキストストリームに改行を置いたときに生成されたCRLFのCRが表示されているようです。この現象は、テキストストリームを使用してバイナリデータであるべきものを書くことにまさにその特徴です。たぶん出力ストリームを開くコードと入力ストリームを表示できますか? –

+0

私は質問にコードを入れましたが、hmjdが指摘したタイプミスがあったようです。修正し、プログラムが動作しているかどうかを確認します。 – angryInsomniac

関連する問題