【问题标题】:Reading a fortran generated binary file into a signed integer array in C++将 fortran 生成的二进制文件读入 C++ 中的有符号整数数组
【发布时间】:2017-10-19 05:59:37
【问题描述】:

我正在学习 C++。我想在 C++ 程序中读取一些由 fortran 程序生成的文件。我要读取的每个文件都包含一个数字列表,这些数字可以是 0、1 或 -1。这些数字是在 fortran 程序中定义的 1 字节整数数组的元素。下面写了一个示例 fortran 代码以及一个示例 C++ 代码(我尝试将文件读入一个无符号整数数组,开始时)。在 fortran 代码中,我在二进制文件中写入一个 1 字节整数数组,然后将该二进制文件读入数组并打印数组元素。当我尝试将相同的二进制文件读入 C++ 代码中的数组,然后打印数组元素时,输出是意外的。有人可以帮我做对吗?如果有人从 fortran 代码中给出第二个 do-loop 的 C++ 等效项,那就太好了。因为,我最终想将文件读入 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

【问题讨论】:

    标签: c++ arrays binaryfiles read-write signed-integer


    【解决方案1】:

    问题是 char 被写成 char,而不是整数。 如果您使用的是符合 C++11 的编译器,则可以使用类型 std::int8_t 类型(在 &lt;cstdint&gt; 中定义)而不是 char。

    如果您使用的是较旧的编译器,则应在打印之前先将 char 转换为整数,如下所示:

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

    【讨论】:

    • 请注意,OP 也以 1 作为索引开始循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 2012-10-13
    • 2016-02-29
    • 2011-05-14
    • 2021-08-30
    相关资源
    最近更新 更多