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

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

0

Решение

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

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]