khaledce Ответов: 1

Прочитать 4 байта с плавающей точкой матрицы файле и вывести его в качестве .КШМ


У меня есть двоичный файл, который имеет матрицу 3601*3601, хранящуюся в виде 2-байтовых целых чисел, я нашел код (опубликованный ниже), который преобразует его в читаемый текстовый файл, такой как .csv

Мой вопрос: теперь у меня есть матрица 3601*3601, хранящаяся в двоичном файле 4 байта с плавающей запятой, как отредактировать мой код, чтобы прочитать этот файл, а затем вывести его в виде десятичной дроби, хранящейся в читаемом текстовом файле типа .csv, как указано выше?

Вот рабочий код для 2 байт целое двоичное:

Что я уже пробовал:

#include <iostream>
    #include <fstream>
    using namespace std;
    
    const int SRTM_SIZE = 3601;
    static int height[SRTM_SIZE][SRTM_SIZE] = {{0},{0}};
        
    int main() {     
    
    ifstream file("/storage/emulated/0/input.hgt", ios::in | ios::binary);
    
    if(!file) {
    cout << "Error opening file!" << 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) )) {
    
        cout << "Error reading file!" << endl;
    
    return -1; }
    
    height[i][j] = (buffer[0] << 8) | buffer[1]; 
                
    } }    
        
    ofstream meinFile;
        
    meinFile.open ("/storage/emulated/0/output.csv");
      
        for(int x = 0; x < SRTM_SIZE; x++)
        { // from row 1 to row SRTM size
    
            for(int y = 0; y < SRTM_SIZE; y++)
            {// from column 1 to SRTM_Size
    
            meinFile << height[x][y] << ",";
                
            }
            
            meinFile << endl;
        }
        
                meinFile.close();
        cout<< "Gratulations!" <<endl;
        cout<< "Your file has been converted sucessfully" <<endl;
        return 0;
    }

1 Ответов

Рейтинг:
1

Jochen Arndt

Считайте их в переменную, как вы уже могли бы сделать с помощью short intс:

float val;
file.read(reinterpret_cast<char*>(&val), sizeof(val));
// Write val to output text file here
Вы даже можете прочитать их все сразу в буфер:
// Use the heap here instead of the stack for large data
float *data = new float[SRTM_SIZE * SRTM_SIZE];
file.read(reinterpret_cast<char*>(data), sizeof(float) * SRTM_SIZE * SRTM_SIZE);
// Write values from array to output text file here
delete[] data;

Но обратите внимание, что значения, считанные из текстового файла позже и преобразованные обратно в плавающую точку, могут немного отличаться. Это особенно относится к тем случаям, когда печать не выполняется с полной точностью. float тип.

[РЕДАКТИРОВАТЬ]
Обратите также внимание, что ваш код создает дополнительную запятую после последнего столбца в CSV-файле. Вместо этого используйте что-то вроде этого:
if (y)
    meinFile << ",";
meinFile << height[x][y];
// When using the data buffer from my 2nd example:
//meinFile << data[x * SRTM_SIZE + y];
[/РЕДАКТИРОВАТЬ]