0

fread を使用して fwrite と read で生成されたファイルは、異なるシステム間で移植可能であると仮定できますか。32 ビット/64 ビット Windows、OSX、Linux。

//dumping
FILE *of =fopen("dumped.bin","w");
double *var=new double[10];
fwrite(var, sizeof(double), 10,FILE);
//reading
file *fo=fopen()
double *var=new double[10];
fread(var,sizeof(double),10,of);

そして、構造体はどうですか

struct mat_t{
    size_t x;
    size_t y;
    double **matrix;
}

これらはポータブルですか?

4

5 に答える 5

5

短い答え:いいえ

長い答え:

データのバイナリ表現を書き出しています。
これは、プラットフォームや OS、さらにはコンパイラ間で移植できません。

作成したすべてのオブジェクトには、変更可能なものがあります。

int:        size and endianess.
double:     size and representation.
structure:  Each member has to be looked at individually.
            The structure itself may be padded different on different compilers.
            Or even the same compiler with different flags.
pointers:   Are meaningless even across processes on the same machine.
            All pointers have to be converted into something meaningful like
            a named object that is provided separately. The transport will then
            have to convert named objects into pointers at the transport layer
            at the destination.

主なオプションは 2 つあります。

  • データのストリーミング。
    これは基本的に、構造をテキスト表現に変換し、文字列を送信することです。小さなオブジェクト、API 構造の場合、これはクロス プラットフォーム/言語通信を行う現在の標準的な方法です (ただし、データは通常、XML や Json などの形式でラップされます)。
  • ネットワークに依存しないバイナリ形式に変換する
    このために、整数を変換するための htonl() と functions() のファミリがあります。double は難しく、通常は 2 つの整数に変換されます (値は精度要件によって異なります)。文字列は長さに変換され、その後に一連の文字などが続きます。次に、それぞれが個別にストリームに書き込まれます。これは、ストリーミングよりもはるかにコンパクトになる可能性があります (したがって効率的です)。欠点は、両端を非常に特定の形式に緊密に結合しているため、ソリューションが特に脆弱になり、エラー状況での修正が難しくなることです。
于 2010-02-03T16:42:31.000 に答える
4

fwriteおよびfread十分に移植可能ですが、sizeof(double)システムによって異なる可能性があるなどの問題が発生します。書き込むすべてのバイナリ フィールドに、コンパイラや OS に依存しない定義済みのサイズがあることを確認してくださいuint32_t

エンディアンについても心配する必要がありますが、エンディアンを交換するために使用できるマクロntohntohlhton、およびがあり、コンパイルするシステムに関係なく正しく動作するように定義する必要があります。htonl

于 2010-02-03T16:30:58.000 に答える
1

このファイルは間違いなく移植可能ではありません。そのため、 htonのようなものが存在します。ファイル形式でサイズとエンディアンが非常に明確に指定されていることを確認する必要があります。個々のタイプは移植可能ではないため、構造体も移植可能ではありません(構造体のパッキングも考慮していません)。

于 2010-02-03T16:29:40.143 に答える
1

構造体を作成していて、それらが自己完結型でない (つまり、ポインターやサブ構造体がある) 場合は、ある種のシリアライゼーション ライブラリを使用する方がはるかに優れています。オブジェクト指向のアプローチを取るBoost Serilizationライブラリがあります。出力はテキストからバイナリに簡単に切り替えることができるため、デバッグがはるかに簡単になります。

HDF5 (Hierarchical Data Format)もあります。これは、通常とは異なるハードウェア (標準の x86 ではない) での科学計算で日常的に使用される一連のライブラリです。私はこれを使ったことがないので、使いやすさについて話すことはできませんが、巨大なデータセット (数 TB) を処理します。

于 2010-02-03T17:24:00.500 に答える
0

Windows はファイルの書き込みがテキスト モードであると想定していることを忘れているため、fwrite() の 2 番目のパラメーターで「w」を「wb」に変更する必要があります。

于 2010-02-03T16:50:58.397 に答える