Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
xXValeraXx
0 / 0 / 1
Регистрация: 14.05.2015
Сообщений: 15
#1

Реализовать считывание данных из файла .grd - C++

16.02.2017, 13:57. Просмотров 322. Ответов 8
Метки нет (Все метки)

В общем, как и сказано в заголовке, нужно реализовать считывание данных из файла .grd. Раньше я только считывал данные из тхт и там все было значительно проще. С grid-файлом так не выходит и я не могу найти структуру этого файла, каждый источник излагает свой вариант и пока не один из них не помог. Или я не умею реализовать считывание файлаи не могу разобраться в описании этог расширения.
Вообще это часть научной работы - входные данные для программы. И научный руководитель настаивает на следующем варианте кода(хотя результат совсем не похож на то, что нужно):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//#include <iostream>
//#include <fstream>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
 
 
//using namespace std;
 
int main()
{
    FILE *outf;
 
short sNx, sNy;
int N, i, ix,iy;
double x_min, x_max, y_min, y_max, z_min, z_max;
 
 
outf = fopen("relief_1024x1024.grd","rb");
 
    fread(&sNx, sizeof(short),   1, outf);
    fread(&sNy, sizeof(short), 1, outf);
    N = sNx*sNy;
 
    printf("Nx=%d, Ny=%d, N=%d \n", sNx, sNy, N);
 
    _getch();
 
    float *z = new float[N];
 
    fread(&x_min, sizeof(double),   1, outf);
    fread(&x_max, sizeof(double), 1, outf);
    fread(&y_min, sizeof(double), 1, outf);
    fread(&y_max, sizeof(double), 1, outf);
    fread(&z_min, sizeof(double), 1, outf);
    fread(&z_max, sizeof(double), 1, outf);
 
 
    for(i=0; i<N; i++)
    {
        fread(&z[i], sizeof(float),   1, outf);
        ix = i % N; iy = i / N;
        //printf("ix=%d, iy=%d, i=%d, z = %g\n", ix,iy,i, z);
    }
    fclose(outf);
 
 
    /*std::ofstream mout("z.txt");
    for(i=0;i<N;i++)
    {
            mout << z[i] <<std::endl;
    }
    mout.close(); // закрываем файл*/
 
    /*float z[K];
 
    for(int i=0;i<K;i++)
    {
        fread(&z[i], sizeof(int),   1, outf);
    }
 
    ofstream fout("z.txt");
        for(int j=0;j<K;j++)
        {
            fout << z[j] <<endl;
        }
    fout.close(); // закрываем файл*/
 
    free(z);
 
    return 1;
}
Также прикрепил файл с которого мне нужно считать данные.
http://www.cyberforum.ru/cpp-beginners/thread1156196.html
0
Вложения
Тип файла: rar relief_1024x1024.rar (812.9 Кб, 4 просмотров)
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2017, 13:57
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Реализовать считывание данных из файла .grd (C++):

Реализовать побайтовое считывание файла
как реализовать побайтовое считывание с файла конкретно в этой программе? ...

Считывание данных из файла
не могу считать данные из файла На вход программы подаются 365 строк, которые...

Считывание данных из файла
// Laboratornaya_4.cpp: определяет точку входа для консольного приложения. //...

Считывание данных из файла
Всем привет, возник вопрос. Нужно считывать из .txt файла координаты точек в...

считывание данных из файла в C++
В файле находиться следующяя информация: ...

8
nd2
2828 / 2398 / 1052
Регистрация: 29.01.2016
Сообщений: 8,022
16.02.2017, 16:41 #2
Цитата Сообщение от xXValeraXx Посмотреть сообщение
я не могу найти структуру этого файла
Тогда это невыполнимое задание. Невозможно извлечь нужные данные из файла неизвестной структуры.
0
xXValeraXx
0 / 0 / 1
Регистрация: 14.05.2015
Сообщений: 15
16.02.2017, 19:27  [ТС] #3
Это файл .grd, используется в ГИС. Его структура не известна мне. А в целом, это расширение имеет вполне определенную структуру. И чтобы получить данные нужно считать некоторое кол-во переменных того или иного типа, а я не знаю в каком порядке и какие переменные в нём хранятся. И надеялся, что в данном вопросе мне поможет человек, который работал с файлами этого расширения и знает как и что из них считывается.
0
nd2
2828 / 2398 / 1052
Регистрация: 29.01.2016
Сообщений: 8,022
16.02.2017, 20:03 #4
Цитата Сообщение от xXValeraXx Посмотреть сообщение
в целом, это расширение имеет вполне определенную структуру.
Если имеет вполне определённую структуру, то как понять это?
Цитата Сообщение от xXValeraXx Посмотреть сообщение
каждый источник излагает свой вариант
Цитата Сообщение от xXValeraXx Посмотреть сообщение
Его структура не известна мне.
Узнай.
Цитата Сообщение от xXValeraXx Посмотреть сообщение
а я не знаю в каком порядке и какие переменные в нём хранятся.
Узнай.
Цитата Сообщение от xXValeraXx Посмотреть сообщение
хотя результат совсем не похож на то, что нужно
Как выглядит этот результат, и чем он не похож на то, что нужно?
0
xXValeraXx
0 / 0 / 1
Регистрация: 14.05.2015
Сообщений: 15
16.02.2017, 20:18  [ТС] #5
Я думаю нету смысла вам объяснять и отвечать. Человек, который работал с grd знает как и что считывать, а вы явно нет, поэтому не вижу смысла обсуждать этот вопрос с вами. Мне нужна помощь того, кто в этом разбирается, т.к. в интернете сложно найти что-то толковое по этому поводу.
0
nd2
2828 / 2398 / 1052
Регистрация: 29.01.2016
Сообщений: 8,022
16.02.2017, 20:25 #6
Цитата Сообщение от xXValeraXx Посмотреть сообщение
я не могу найти структуру этого файла, каждый источник излагает свой вариант и пока не один из них не помог.
Не помог в чём? Чтобы кто-то сделал за тебя?
0
xXValeraXx
0 / 0 / 1
Регистрация: 14.05.2015
Сообщений: 15
16.02.2017, 20:48  [ТС] #7
Я не знаю структуру, соответственно не могу считать все как нужно. Знающий человек скажет в каком порядке и какие считать переменные. Или может у меня просто что-то не так оформлено в проге. А вы просто спорите, можете больше не захламлять эту тему, пожалуйста.
Я нигде не говорил "напишите мне прогу", а скинул свою и жду, что кто-то подскажет что в ней не так, а не подсказки в духе:"узнай",- я думал на этом форуме и узнают у других программистов и если я пишу сюда, значит уже искал вне форума и не нашел.
0
nd2
2828 / 2398 / 1052
Регистрация: 29.01.2016
Сообщений: 8,022
16.02.2017, 22:41 #8
Лучший ответ Сообщение было отмечено xXValeraXx как решение

Решение

Цитата Сообщение от xXValeraXx Посмотреть сообщение
Я нигде не говорил "напишите мне прогу", а скинул свою и жду, что кто-то подскажет что в ней не так,
Я насчёт твоего кода спросил:
Цитата Сообщение от xXValeraXx Посмотреть сообщение
хотя результат совсем не похож на то, что нужно
Цитата Сообщение от nd2 Посмотреть сообщение
Как выглядит этот результат, и чем он не похож на то, что нужно?
Но ты не ответил.
Цитата Сообщение от xXValeraXx Посмотреть сообщение
Я не знаю структуру
Ну, вот здесь структура хорошо описана: http://geospatialdesigns.com/surfer6_format.htm

Добавлено через 48 минут
В твоём коде ошибка в начале чтения: прежде, чем читать два short, нужно пропустить маркер файла (DSBB), размер маркера - 4 байта.

Добавлено через 30 минут
Дальше там с чтением всё правильно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
int main()
{
    FILE *outf;
 
    short sNx, sNy;
    int N, i, ix,iy;
    double x_min, x_max, y_min, y_max, z_min, z_max;
    
    outf = fopen("relief_1024x1024.grd","rb");
    if (!outf)
    {
        printf("Error opening file!\n");
        _getch();
        return 0;
    }
    
    // читаем и проверяем маркер файла
    char marker[5] = {0};
    fread(marker, sizeof(char), 4, outf);
    printf("%s\n", marker);
    if (strcmp(marker, "DSBB") != 0)
    {
        printf("The file format is not the same!\n");
        _getch();
        return 0;
    }
    
    fread(&sNx, sizeof(short), 1, outf);
    fread(&sNy, sizeof(short), 1, outf);
    N = sNx*sNy;
 
    printf("Nx=%d, Ny=%d, N=%d \n", sNx, sNy, N);
 
    _getch();
 
    float *z = new float[N];
 
    fread(&x_min, sizeof(double), 1, outf);
    fread(&x_max, sizeof(double), 1, outf);
    fread(&y_min, sizeof(double), 1, outf);
    fread(&y_max, sizeof(double), 1, outf);
    fread(&z_min, sizeof(double), 1, outf);
    fread(&z_max, sizeof(double), 1, outf);
 
 
    for(i=0; i<N; i++)
    {
        fread(&z[i], sizeof(float),   1, outf);
        ix = i % N; iy = i / N;
        //printf("ix=%d, iy=%d, i=%d, z = %g\n", ix,iy,i, z);
    }
    fclose(outf);
 
 
    /*std::ofstream mout("z.txt");
    for(i=0;i<N;i++)
    {
            mout << z[i] <<std::endl;
    }
    mout.close(); // закрываем файл*/
 
    /*float z[K];
 
    for(int i=0;i<K;i++)
    {
        fread(&z[i], sizeof(int),   1, outf);
    }
 
    ofstream fout("z.txt");
        for(int j=0;j<K;j++)
        {
            fout << z[j] <<endl;
        }
    fout.close(); // закрываем файл*/
 
    free(z);
 
    return 0;
}
1
xXValeraXx
0 / 0 / 1
Регистрация: 14.05.2015
Сообщений: 15
17.02.2017, 00:19  [ТС] #9
Спасибо большое, наконец-то будет возможность доделать эту научную работу)так давно бился над этой, казалось бы, простой задачей при том, что вычислительный блок уже сделал и намного быстрее.
0
17.02.2017, 00:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.02.2017, 00:19
Привет! Вот еще темы с решениями:

Считывание данных из файла
Есть файл в котором содержится число 145. Мне нужно считать из файла это число...

Считывание данных с файла
Здравствуйте, помогите пожалуйста, программа не может прочитать данные из файла...

Считывание данных из файла
Нужно реализовать вывод данных структуры из файла.. Задание: Заполнение...

Считывание данных из файла
Всем здравствуйте... вообщем создан пользовательский класс пассажир class...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru