将fortran生成的二进制文件读取到C++中的带符号整数数组中
Reading a fortran generated binary file into a signed integer array in C++
我正在学习C++。我想在C++程序中读取一些由fortran程序生成的文件。我要读取的每个文件都包含一个数字列表,这些数字要么是0,要么是1,要么是-1。这些数字是fortran程序中定义的1字节整数数组的元素。下面写了一个示例fortran代码和一个示例C++代码(首先,我试图将文件读取到一个无符号整数数组中)。在fortran代码中,我在二进制文件中写入一个1字节整数数组,然后将该二进制文件读取到数组中,并打印数组元素。当我尝试将相同的二进制文件读取到C++代码中的数组中,然后打印数组元素时,输出是意外的。有人能帮我把事情做好吗?如果有人给出一个相当于fortran代码中第二个do循环的C++,那就太好了。既然,我终于想把文件读取到1字节有符号整数数组中,那么需要什么呢?
fortran90代码:
implicit none;
integer*1 a(1:2),i
open(10, file="binary.bin", access="stream", form="unformatted")
do i=1,2,1
a(i)=1
write(10) a
enddo
close(unit=10)
open(20, file="binary.bin", access="stream", form="unformatted")
do i =1,2,1
read(20) a(i)
write(*,*) a
enddo
close(unit=20)
end
输出:
1
1
C++代码:
#include <iostream>
#include <fstream>
int main()
{
int i = 1;
int j = 1;
int max_i = 2;
char a[2];
using namespace std;
std::ifstream myinputFile;
myinputFile.open ("binary.bin", std::ios::in | std::ios::binary);
if (!myinputFile.is_open()) return false;
for (i = 1; i <= max_i; ++i) {
myinputFile.read (a, 2);
std::cout << i <<" "<< a[i] << std::endl ;
}
return 0;
}
Output:
1
2 @
-----------
Expected output:
1 1
2 1
问题是char被写成char,而不是整数。如果使用的是兼容C++11的编译器,则可以使用类型std::int8_t
type(在<cstdint>
中定义)而不是char。
如果您使用的是较旧的编译器,则应在打印之前先将char转换为整数,如下所示:
std::cout << i << static_cast<int>(a[i]) << std::endl;
相关文章:
- 检查TCHAR数组输入是否为带符号整数C++
- GDB:运行不带符号的 cpp 进程调试
- 使用范围检查和带符号的size_type扩展std::vector
- 将fortran生成的二进制文件读取到C++中的带符号整数数组中
- 用于在2个带符号整数区间之间进行除法的C++算法
- 如何从uint8_t的缓冲区读取带符号整数,而不调用未定义或实现定义的行为
- 仅使用位操作(不使用分支)将16位带符号值约束在0和4095之间
- 在c++中通过串行发送一个带符号的整数作为字节,Arduino读取它
- 带符号的16位SSE平均值
- types.h中的内容——编译器在哪里定义int、带符号int和其他值的宽度
- 使用带符号字符输入的isalnum-Visual C++
- 如何对具有带符号数字类型的事物进行谓词
- mkdir,带符号的路径名
- 返回特定位范围内的带符号值
- 为什么唯一的带符号整数类型会导致clang中的溢出警告
- 使用reinterpret_cast强制转换导致:OverflowError:带符号整数小于最小值
- 格式化带符号十六进制数字的输出
- 如何在C++中安全地比较32位整数和64位整数,以及如何在内部比较带符号整数
- 为32位纹理(R11F_G11F_B10F)的每个像素存储3个带符号浮点(从-4到4)
- 使用cv::Mat作为带符号值