4

我想为占用太多 RAM 的程序执行磁盘 I/O 操作。我使用双精度矩阵并认为将它们作为字节写入磁盘是最快的方法(我需要保留双精度)。

如何做到便携?

我找到了这段代码(here),但作者说它不是可移植的......

#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

如何做到便携?

可移植性有不同的定义/级别。如果您所做的只是在一台机器上编写这些代码并在同一台机器上读取它,那么您唯一关心的可移植性就是这段代码是否定义良好。(确实如此。)
如果您想在多个不同平台上进行可移植的编写,则需要编写字符串值,而不是二进制值。

但是,请注意,您拥有的代码缺乏适当的错误处理。它不检查文件是否可以打开并成功写入。

于 2011-07-22T12:26:42.667 回答
2

我认为仅当您写入文件并在另一台机器上读取文件时才会出现可移植性问题。但是,由于您说由于内存限制而要读/写文件,我只能假设您一次在一台机器上进行读/写操作。这应该有效。

于 2011-07-22T12:29:24.513 回答
1

他可能指的是一般的二进制表示,而不仅仅是 sizeof。

C - 浮点数的序列化(浮点数、双精度数)

该规范根本没有指定浮点数的二进制表示。 大多数编译器都遵循 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 回答