Как читать файлы HGT в переполнении стека

Я пытаюсь прочитать данные о высоте, хранящиеся в файлах HGT. Насколько я знаю, их можно читать как двоичные файлы.

Я нашел эту тему:
Как получить доступ к файлам .HGT SRTM в C ++?

Исходя из этого поста, мой пример кода:

#include <iostream>
#include <fstream>

int main(int argc, const char * argv[])
{

std::ifstream::pos_type size;
char * memblock;

std::ifstream file ("N45W066.hgt", std::ios::in|std::ios::binary|std::ios::ate);

if (file.is_open())
{
size = 2;
memblock = new char [size];

file.seekg(0, std::ios::beg);
file.read(memblock, size);

int srtm_ver = 1201;
int height[1201][1021];

for (int i = 0; i<srtm_ver; ++i){
for (int j = 0; j < srtm_ver; ++j) {

height[i][j] = (memblock[0] << 8 | memblock[1]);
std::cout<<height[i][j]<<" ";
}
std::cout<<std::endl;
}
}return 0;
}

После первого запуска он дает мне кучу нулей, и ничего больше: |
Файл hgt хорош, я проверил его с помощью приложения, которое может читать несколько типов файлов карт, и он содержит данные о высоте, что мне нужно.

0

Решение

Это прочитает файл и заполнит массив правильно. Чтение 2 байтов за раз, как правило, не самый эффективный способ сделать это, но это просто. Альтернативой было бы прочитать весь файл и затем поменять местами байты.

Я переместил массив высоты за пределы main, чтобы избежать проблемы переполнения стека с размером стека по умолчанию в Visual Studio. Если ваш стек достаточно велик, вы можете переместить его назад или динамически распределить память в куче.

#include <iostream>
#include <fstream>

const int SRTM_SIZE = 1201;
short height[SRTM_SIZE][SRTM_SIZE] = {0};

int main(int argc, const char * argv[])
{
std::ifstream file("N45W066.hgt", std::ios::in|std::ios::binary);
if(!file)
{
std::cout << "Error opening file!" << std::endl;
return -1;
}

unsigned char buffer[2];
for (int i = 0; i < SRTM_SIZE; ++i)
{
for (int j = 0; j < SRTM_SIZE; ++j)
{
if(!file.read( reinterpret_cast<char*>(buffer), sizeof(buffer) ))
{
std::cout << "Error reading file!" << std::endl;
return -1;
}
height[i][j] = (buffer[0] << 8) | buffer[1];
}
}

//Read single value from file at row,col
const int row = 500;
const int col = 1000;
size_t offset = sizeof(buffer) * ((row * SRTM_SIZE) + col);
file.seekg(offset, std::ios::beg);
file.read( reinterpret_cast<char*>(buffer), sizeof(buffer) );
short single_value = (buffer[0] << 8) | buffer[1];
std::cout << "values at " << row << "," << col << ":" << std::endl;
std::cout << "  height array: " << height[row][col] << ", file: " << single_value << std::endl;

return 0;
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector