4

RAMを大量に消費するプログラムに対してディスクI/O操作を実行したい。私は倍精度の行列を使用し、バイトとしてディスクに書き込むのが最速の方法だと思います(倍精度を維持する必要があります)。

移植性でそれを行う方法は?

私はこのコード(ここ)を見つけましたが、作者はそれが移植性がないと言っています...

#include <iostream>
#include <fstream>

int main()
{
    using namespace std;

    ofstream ofs( "atest.txt", ios::binary );

    if ( ofs ) {
        double pi = 3.14;

        ofs.write( reinterpret_cast<char*>( &pi ), sizeof pi );
        // Close the file to unlock it
        ofs.close();

        // Use a new object so we don't have to worry
        // about error states in the old object
        ifstream ifs( "atest.txt", ios::binary );
        double read;

        if ( ifs ) {
            ifs.read( reinterpret_cast<char*>( &read ), sizeof read );
            cout << read << '\n';
        }
    }

    return 0;
}
4

4 に答える 4

5

移植性でそれを行う方法は?

移植性にはさまざまな定義/レベルがあります。これらを1台のマシンで記述し、同じマシンで読み取るだけの場合、関係する唯一の移植性は、このコードが明確に定義されているかどうかです。(そうです。)
複数の異なるプラットフォーム間で移植可能に書き込みたい場合は、バイナリ値ではなく文字列値を書き込む必要があります。

ただし、使用しているコードには適切なエラー処理がないことに注意してください。ファイルを開いて正常に書き込むことができるかどうかはチェックされません。

于 2011-07-22T12:26:42.667 に答える
2

移植性の問題は、ファイルに書き込んで別のマシンで読み取った場合にのみ発生すると思います。ただし、RAMの制限のためにファイルの読み取り/書き込みを行うと言ったので、一度に1台のマシンで読み取り/書き込み操作を実行することしか想定できません。これは機能するはずです。

于 2011-07-22T12:29:24.513 に答える
1

彼は、sizeofだけでなく、一般的にバイナリ表現について言及していた可能性があります。

C-浮動小数点数のシリアル化(floats、doubles)

この仕様では、浮動小数点数の2進表現はまったく指定されていません。 ほとんどのコンパイラはIEEEに準拠しているため、ターゲットプラットフォームがわかっている場合は、少しの単体テストで目的の動作を確認する必要があります。

于 2011-07-22T15:21:59.993 に答える
0

通常、私はユニオンでバイトにアクセスします。

union Data {
    double val;
    unsigned char str[sizeof(double)];
};

void saveToFile(double *values, int nvalues, const char *filename){
    int i;
    FILE *arq;
    Data num;

    arq=fopen(filename,"w");
    if (arq == NULL) {
        printf("Failed to open file \"%s\"\n", filename);
        exit(0);
    }

    for(i=0; i<nvalues; i++){
        num.val = values[i];
        fwrite (num.str , sizeof(char), sizeof(double), arq);    //ChunkSize
    }

    fclose(arq);
}

void loadFromFile(double *values, int nvalues, const char *filename){
    int i;
    FILE *arq;
    Data num;

    arq=fopen(filename,"r");
    if (arq == NULL) {
        printf("Failed to open file \"%s\"\n", filename);
        exit(0);
    }

    for(i=0; i<nvalues; i++){
        fread(num.str, sizeof(char), sizeof(double), arq);
        values[i] = num.val;
    }

    fclose(arq);
}
于 2015-11-10T12:39:56.977 に答える