2017-10-19 108 views
0

我正在學習C++。我想讀一些由C++程序中的fortran程序生成的文件。我想要讀取的每個文件都包含一個0,1或-1的數字列表。這些數字是fortran程序中定義的1字節整數數組的元素。以下是一個示例Fortran代碼以及一個示例C++代碼(我嘗試將該文件讀入一個無符號整數數組中,以此開始)。在Fortran代碼中,我將一個1字節整數數組寫入二進制文件,然後將該二進制文件讀入數組並打印數組元素。當我嘗試在C++代碼中將相同的二進制文件讀入數組中,然後打印數組元素時,輸出是意外的。有人能幫助我解決問題嗎?如果有人給出了Fortran代碼中的第二個do循環的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兼容編譯器,則可以使用類型std::int8_t類型(在<cstdint>中定義)而不是char。

如果您使用的是較舊的編譯器,你應該字符轉換爲整數首先打印出來,這樣才:

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

請注意,OP也開始以1環爲指標。 –

+0

好點,錯過了。 – Patrick

相關問題