输出未格式化的C ++,类似于FORTRAN

时间:2018-04-19 14:07:06

标签: c++ fortran output ofstream

我希望将一些FORTRAN代码转换为C ++。 我对未格式化的输出有一些问题。

在FORTRAN中我有一些代码如下

program main
integer*4 :: one
one = 1
open(unit = temp, file = "temp.dat", status = 'replace', form='unformatted')
WRITE(temp) one, one
end

此代码的输出最终为

0x0800 0000 0100 0000 0100 0000 0800 0000 
0x0a

所以对我来说,好像输出有点奇怪。我一直在玩它,我认为0x08是针对正在写入的变量的大小,两个0x00000001是针对正在写入的两个四字节的,而0x00000008可能是一个封闭大小的缓冲区(我不是知道为什么当开放缓冲区是单个字节时这将是4个字节)。 0x00000a似乎是一个EOF字符。

当我尝试用C ++模仿输出时,我做

int main(){
    long one = 1;
    std::ofstream outFile;
    outFile.open("temp.dat", std::ofstream::out)
    outFile << one << one;
    outFile.close()
}

这不起作用,因为它试图将字符串写成1而不是二进制,所以我尝试了:

int main(){
    long one = 1;
    std::ofstream outFile;
    outFile.open("temp.dat", std::ofstream::out) 
    outFile.write((char*) one, sizeof(one));  //Line a
    outFile.write((char*) one, sizeof(one));
    outFile.close()
}

希望通过将其转换为char来输出直接二进制文件。 不幸的是,这在a线上有一个SigSev故障。我不太清楚为什么。

这样的方法是一种好的方法,还是应该尝试朝不同的方向发展?

1 个答案:

答案 0 :(得分:1)

从chtz窃取,我发现了一种匹配两个输出的方法。我不知道这是否最有效。

int main(){
    int one = 1;
    int sizeOf = 2*sizeof(one);
    std::ofstream outFile;
    outFile.open("temp.dat", std::ofstream::out) 
    outFile.write(reinterpret_cast<const char*>(&sizeOf),sizeof(sizeOf)); 
    outFile.write(reinterpret_cast<const char*>(&one),sizeof(one));
    outFile.write(reinterpret_cast<const char*>(&one),sizeof(one));
    outFile.write(reinterpret_cast<const char*>(&sizeOf),sizeof(sizeOf));  

    outFile.close()
}