2017-10-19 6 views
0

私はC++を学んでいます。私はFortranプログラムによって生成されたいくつかのファイルをC++プログラムで読みたいと思っています。私が読みたいファイルのそれぞれには、0,1、または-1の数字のリストが含まれています。これらの数値は、Fortranプログラムで定義された1バイト整数の配列の要素です。サンプルのFortranコードとサンプルのC++コード(ここでは、まず符号なし整数配列にファイルを読み込もうとします)を次に示します。 Fortranコードでは、バイナリファイルに1バイト整数の配列を書き込み、そのバイナリファイルを配列に読み込んで配列要素を出力します。同じバイナリファイルをC++コードの配列に読み込み、配列要素を出力しようとすると、出力が予想外になります。誰かがそれを得るのを助けることができますか?誰かがFortranコードから2番目のdo-loopに相当するものをC++に与えるといいでしょう。最終的にファイルを1バイトの符号付き整数配列に読み込みたいので、そのために必要なのは何ですか?Fortranで生成されたバイナリファイルをC++で符号付き整数配列に読み込む

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 

出力:


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

問題は、char年代はない整数として、シャアのように書かれているということです。 C++ 11準拠のコンパイラを使用している場合、charの代わりにタイプstd::int8_t<cstdint>で定義)を使用できます。

古いコンパイラを使用している場合は、このように、最初にそれを印刷する前に整数に文字を変換する必要があります。

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

OPもインデックスとして1でループを開始していることに注意してください。 –

+0

良い点、それを逃した。 – Patrick

関連する問題