我希望将一些 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()
}
希望通过将其转换为字符,直接输出二进制文件。 不幸的是,这在 a 线上有一个 SigSev 故障。我不太清楚为什么。
这样的方法是好的方法,还是我应该尝试朝不同的方向发展?
最佳答案
所以从 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()
}
关于c++ - 输出类似于 FORTRAN 的未格式化 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49923179/