Чтение сгенерированного фортраном двоичного файла в массив целых чисел со знаком в С++

Я изучаю С++. Я хочу прочитать некоторые файлы, сгенерированные программой fortran в программе C++. Каждый из файлов, которые я хочу прочитать, содержит список чисел, равных 0, 1 или -1. Эти числа являются элементами массива 1-байтовых целых чисел, определенных в программе на Фортране. Пример кода на Фортране, а также пример кода на C++ (в котором я пытаюсь прочитать файл в массив целых чисел без знака, для начала) написан ниже. В коде на Фортране я записываю массив 1-байтовых целых чисел в двоичный файл, затем читаю этот двоичный файл в массив и печатаю элементы массива. Когда я пытаюсь прочитать тот же двоичный файл в массив в коде C++, а затем распечатать элементы массива, результат будет неожиданным. Может ли кто-нибудь помочь мне сделать это правильно? Было бы здорово, если бы кто-нибудь дал C++-эквивалент второго цикла do-loop из кода fortran. Поскольку я, наконец, хочу прочитать файлы в 1-байтовые целочисленные массивы со знаком, что для этого нужно?

код фортран90:

    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


Код С++:

#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

person Harinder Pal    schedule 19.10.2017    source источник


Ответы (1)


Проблема в том, что char записываются как char, а не как целые числа. Если вы используете компилятор, совместимый с C++11, вы можете использовать тип std::int8_t type (определенный в <cstdint>) вместо char.

Если вы используете более старый компилятор, вы должны сначала преобразовать char в целое число, прежде чем печатать его, например:

std::cout << i << static_cast<int>(a[i]) << std::endl;
person Patrick    schedule 19.10.2017
comment
Обратите внимание, что OP также начинает цикл с 1 в качестве индекса. - person Bob__; 19.10.2017