2017-08-13 5 views
-3

Swiftのバイナリ.hgtファイルから標高データを読み取る必要があります。 this result for cが見つかりましたが、Swiftに移行することはできません。Swiftのバイナリ(.hgt)ファイルを読み込みます(C++からswiftへのコードの移行)

#include <stdio.h> 

#define SIZE 1201 
signed short int matrix[SIZE][SIZE] = {0}; 

int main(int argc, const char * argv[]) 
{ 
FILE *fp = fopen("N49E013.hgt", "rb");  

unsigned char buffer[2]; 
for (int i = 0; i < SIZE; ++i) 
{ 
    for (int j = 0; j < SIZE; ++j) 
    { 
     if (fread(buffer, sizeof(buffer), 1, fp) != 1) 
     { 
      printf("Error reading file!\n"); 
      system("PAUSE"); 
      return -1; 
     } 
     matrix[i][j] = (buffer[0] << 8) | buffer[1];  
    } 
} 

fclose(fp); 
} 

答えて

2

#define SIZE 1201

これは、 'SIZE' という名前の定数を定義し、そのための操作を行います。

let size = 1201

次:

FILE *fp = fopen("N49E013.hgt", "rb");

これがためにファイルを開きます読書我々はそれを行うことができます。 'defer'ブロックでファイルを閉じて、何が起きてもファイルが閉じられるようにします。

// change the path below to the correct path 
let handle = try FileHandle(forReadingFrom: URL(fileURLWithPath: "/path/to/N49E013.hgt")) 
defer { handle.closeFile() } 

ここで、マトリックスを構築します。 size個の配列を作成したいとします。配列の数はそれぞれsizeです。ファイルから読み込みます。オリジナルは、forループのネストされた2を使用したが、スウィフトは、我々はもう少しエレガントにこれを行うために使用することができる機能プログラミング構造を、サポートしています。

let matrix = try (0..<size).map { _ in 
    try (0..<size).map { _ -> Int in 
     // Unfortunately, FileHandle doesn't have any decent error-reporting mechanism 
     // other than Objective-C exceptions. 
     // If you need to catch errors, you can use fread as in the original, 
     // or use an Objective-C wrapper to catch the exceptions. 

     let data = handle.readData(ofLength: 2) 

     if data.count < 2 { throw CocoaError(.fileReadCorruptFile) } 

     return (Int(data[0]) << 8) | Int(data[1]) 
    } 
} 

は、それはそれを行うべきと考えてください。

関連する問題