C++ C++;从二进制文件写入和读取双倍

C++ C++;从二进制文件写入和读取双倍,c++,io,portability,binaryfiles,double-precision,C++,Io,Portability,Binaryfiles,Double Precision,我想对占用太多RAM的程序执行磁盘I/O操作。 我使用双精度矩阵,并认为将它们作为字节写入磁盘是最快的方法(我需要保持双精度) 如何实现便携性 我找到了这段代码(),但作者说它不可移植 #include <iostream> #include <fstream> int main() { using namespace std; ofstream ofs( "atest.txt", ios::binary ); if ( ofs ) {

我想对占用太多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;
}
#包括
#包括
int main()
{
使用名称空间std;
ofs流(“atest.txt”,ios::binary);
如果(ofs){
双pi=3.14;
ofs.write(重新解释铸件(&pi),pi尺寸);
//关闭文件以解除锁定
ofs.close();
//使用一个新的对象,这样我们就不用担心了
//关于旧对象中的错误状态
ifstream-ifs(“atest.txt”,ios::binary);
双读;
国际单项体育联合会{
ifs.read(重新解释和读取),读取大小;
库特
如何实现便携性

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


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

我认为只有在您写入文件并在另一台机器上读取时,才会出现可移植性问题。然而,既然您说您要读取/写入文件,因为ram限制ns,我只能假设您一次只能在一台机器上执行读/写操作。这应该是可行的。

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


该规范根本没有指定浮点数的二进制表示形式。大多数编译器遵循IEEE,因此,如果您了解目标平台,进行一点单元测试应该可以确保您想要的行为。

通常我使用union访问字节

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);
}
联合数据{
双val;
无符号字符str[sizeof(double)];
};
void saveToFile(双*值、int-n值、常量字符*文件名){
int i;
文件*arq;
数据数;
arq=fopen(文件名,“w”);
if(arq==NULL){
printf(“无法打开文件\%s\”\n,文件名);
出口(0);
}

对于(i=0;iIt是不可移植的,因为
sizeof(double)
可能在不同的平台上有所不同。您需要检查这一点,否则示例代码就可以了。我更担心
double
的字节顺序,因为这更容易改变(特别是在与任何嵌入式硬件交互时)是的,虽然用“可能”来谈论和思考是一个坏习惯。如果你真的关心可移植性,那么它是没有等级的。@Luchian:我很抱歉。
:)
我的可移植性的“等级”来自个人计算机(在windows和linux/unix上)我想写字节,因为我需要最大速度和最小速度size@Andy:您误解了。您想在Windows计算机上写入这些文件并在Unix计算机上读取它们吗?还是想在同一台计算机上写入和读取它们(但代码应该可以在任何计算机上运行)?抱歉:)I/O应该在同一台机器上。boost序列化库是一种很好的方法吗?@Andy:我还没有使用过它,但我想它写/读字符串化数据。如果严格地说是在同一台机器上,写二进制文件应该更快。而且它应该可以在任何一台机器上工作平台。但别忘了,有些机器使用小端IEEE,有些使用大端IEEE格式——大致上是Intel和“其他所有人”(PPC、SPARC,…).是的,当然。我认为重点是你需要编写测试,以确保你希望针对的每个平台的有效性……在这种情况下,这只是一个薄薄的表面,掩盖了你实际上只是在做一个隐式的
重新解释\u cast
。因此,按照OP.a的要求,这完全没有什么不同或更具可移植性如果你必须重新解释,请诚实地写出来。