2017-10-19 42 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

相关问题