将Fortran生成的二进制文件读入C ++中的带符号整数数组

时间:2017-10-19 05:59:37

标签: c++ arrays binaryfiles read-write signed-integer

我正在学习C ++。我想在C ++程序中读取由fortran程序生成的一些文件。我想要读取的每个文件都包含一个0,1或-1的数字列表。这些数字是fortran程序中定义的1字节整数数组的元素。下面是一个示例fortran代码,以及一个示例C ++代码(我尝试将该文件读入无符号整数数组)。在fortran代码中,我在二进制文件中写入一个1字节整数数组,然后将该二进制文件读入数组并打印数组元素。当我尝试将相同的二进制文件读入C ++代码中的数组,然后打印数组元素时,输出是意外的。有人可以帮助我做对吗?如果有人从fortran代码中提供C ++等效的第二个do-loop,那将会很棒。从那以后,我终于想把文件读成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

1 个答案:

答案 0 :(得分:0)

问题在于char是用char编写的,而不是整数。 如果您使用的是兼容C ++ 11的编译器,则可以使用类型std::int8_t类型(在<cstdint>中定义)而不是char。

如果您使用的是较旧的编译器,则应在打印前将char转换为整数,如下所示:

std::cout << i << static_cast<int>(a[i]) << std::endl;