2012-03-14 12 views
1

Cygwinの下での作業は実際には好きではありません。64ビット未満のfstreamの問題cygwin

問題は、64ビットg ++を使用して同じコードをコンパイルすると、予期しない別の結果が発生することです。

#include <iostream> 
#include <fstream> 
using namespace std; 

int main() 
{ 
    int rows = 200; 
    int cols = 200; 
    float data[rows*cols]; 
    for (int i = 0; i < rows; i++) 
    { 
     for (int j = 0; j < cols; j++) 
     { 
      data[i*cols+j] = i*cols+j; 
     } 
    } 
    const char *file = "tmp.txt"; 
    ofstream fs(file); 
    if (fs.is_open()) 
    { 
     fs.write((char*)&rows, sizeof(int)); 
     cout << fs.tellp() << endl; 
     fs.write((char*)&cols, sizeof(int)); 
     cout << fs.tellp() << endl; 
     fs.write((char*)data, sizeof(float)*rows*cols); 
     cout << fs.tellp() << endl; 
     fs.close(); 
    } 
    return 0; 
} 

私は、バイナリファイルに二つの整数と浮動小数点値のブロックを書いています:

ソースコードは次のようになります。 これは、書き込んだバイト数を出力します。

期待される結果は次のとおりです。

​​

すべてのアクションはCygwinの下で行いました。 g ++ .exeでコードをコンパイルすると、結果は正しいです。

しかし、x86_64-w64-mingw32-g ++ .exe(64ビットバイナリを生成できる)を使用すると、結果は配線されます。

4 
8 
160506 

これはどのような余分なバイトですか? 私はここで私の運を試しています。

ありがとうございました。

答えて

2

ファイルがバイナリモードで開かれていないため、すべての改行文字(つまり0x0Aバイト)がキャリッジリターン+改行シーケンスに変換されていると思います。あなたの浮動小数点数の配列には、このようなバイトが500個あると確信しています。

は、このようなあなたの出力ストリームを開いてみてください:

ofstream fs(file, ios_base::binary); 
+1

あなたは、コードを少し簡略化することができます: 'のstd :: ios_base :: out'が'のstd :: ofstream'すなわち 'のstdのために自動的に追加されます:: ofstream out(ファイル名、std :: ios_base :: binary) 'で十分です。 32ビット版の動作が異なるということはちょっと奇妙です。ファイルが内部的に常に32ビットモード(UNIXの動作とよく似ています)でバイナリモードで開かれていて、64ビットモードでは開かれていないことを意味します。 –

+0

ありがとう@ニーモ!問題は、ios_base :: binaryを追加することで解決されます。しかし、データに改行文字はありません。どのストリームが改行があるかどうかを判断することができますか? –

+0

@ mr.pppoe - あなたの 'float'配列はバイナリデータです。すなわち、単なる束である。どこかで、それらのバイトのいくつかは0x0Aに等しくなる可能性があります。これは改行文字です。 – Nemo

関連する問題