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
これはどのような余分なバイトですか? 私はここで私の運を試しています。
ありがとうございました。
あなたは、コードを少し簡略化することができます: 'のstd :: ios_base :: out'が'のstd :: ofstream'すなわち 'のstdのために自動的に追加されます:: ofstream out(ファイル名、std :: ios_base :: binary) 'で十分です。 32ビット版の動作が異なるということはちょっと奇妙です。ファイルが内部的に常に32ビットモード(UNIXの動作とよく似ています)でバイナリモードで開かれていて、64ビットモードでは開かれていないことを意味します。 –
ありがとう@ニーモ!問題は、ios_base :: binaryを追加することで解決されます。しかし、データに改行文字はありません。どのストリームが改行があるかどうかを判断することができますか? –
@ mr.pppoe - あなたの 'float'配列はバイナリデータです。すなわち、単なる束である。どこかで、それらのバイトのいくつかは0x0Aに等しくなる可能性があります。これは改行文字です。 – Nemo