我希望将一些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故障。我不太清楚为什么。
这样的方法是一种好的方法,还是应该尝试朝不同的方向发展?
答案 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()
}