Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
kiruhka
1 / 1 / 0
Регистрация: 08.09.2009
Сообщений: 103
#1

Как считывать информация с файла по байтам - C++

15.10.2012, 07:20. Просмотров 2189. Ответов 20
Метки нет (Все метки)

У меня есть файл, выглядит как график, hex-вид :
00000001: 80 01 00 02 00 05 00 02 00 56 80 02 00 03 00 55
00000002: 56 00 00 04 22 00 88 00 00 05 87 00 80 03 25 00

первое слово 80 01 это координата Xи все слова начинающиеся на 80 это X
второе слово 00 02 это координата Y
третье слово 00 05 это значение переменной А в точке XY
Далее идет чередование Y и A, и так до следующей координаты X

Как в C++ считать его по словам размером в 2 байта и записать слова в динамический массив типа
t[X]=A. Во всех значениях, кроме данных игриков записать A=0.
Объяснила как могла. Помогите пожалуйста!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2012, 07:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как считывать информация с файла по байтам (C++):

Как считывать данные из файла? - C++
как считывать и записывать данные из файла по строкам в переменную?

Как считывать матрицу из файла? - C++
Как можно считать матрицу из файла по столбикам? Понятия не имею как можно это сделать, а надо. Матрица как на прикрепленном...

Как считывать с файла и заполнять структуру? - C++
есть такое задание: каждый элемент исходного файла имеет след. структуру : Фамилия, № группы, оценка 1 оценка 2, оценка 3 Фамилия - не...

Как считывать из файла по одному слову - C++
Есть файл с текстом, надо считать слово, что-то с ним сделать, потом считать следующее, так до конца файла Главный вопрос именно в...

Как считывать с файла данные блоками? - C++
Есть код. Нужно считывать с файла информацию и подсчитать количество символов.Предусмотреть диагностику ошибок. Обязательно применение...

Как считывать из файла данные по 64 бита - C++
надо из созданого мной myfile.txt считывать информацию по блокам в 64 бита(в дальнейшем разбить их на 16 битные блоки),не очень хорошо...

20
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.10.2012, 07:36 #2
Не понятно, куда что записать. Может t[X][Y] = A ?
0
kiruhka
1 / 1 / 0
Регистрация: 08.09.2009
Сообщений: 103
15.10.2012, 07:40  [ТС] #3
может и так, дело в том что значение Х известно, а вот количество Y в которых A не равно 0 нет
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.10.2012, 07:46 #4
И как читать? X, Y, A, потом до следующего X пропускать?

Добавлено через 2 минуты
Текст задания есть?
0
kiruhka
1 / 1 / 0
Регистрация: 08.09.2009
Сообщений: 103
15.10.2012, 07:47  [ТС] #5
как бы объяснить. в слово 80 01 это координата х, точнее старший байт 80 это просто отличительный знак. на самом деле это Х=1. Далее идет слово значение координаты Y, в которой A=00 05h. Во всех значениях до этого Y= 00 02h A=0.Например при Y=00 01h A=0 и так далее чередуется до следущего слова начинающегося на 80. И вот мне надо записать в массив.
ну вот я никак не могу понять как считывать байты и составлять из них слова.

Добавлено через 39 секунд
текста нет, все мне давалось на словах
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.10.2012, 08:31 #6
Как вариант. Считать координату, как две строки (для примера) :
C++
1
2
string str1 = "00";
string str2 = "0f";
Объединить их:
C++
1
string str = str1 + str2;
Пропустить строку через поток с внутренним форматированием в hex виде:
C++
1
2
stringstream s;
s << hex << str;
На выходе получаем координату в десятичном виде, с которой уже можно работать:
C++
1
2
int i;
s >> i; // i = 15
0
kiruhka
1 / 1 / 0
Регистрация: 08.09.2009
Сообщений: 103
15.10.2012, 08:40  [ТС] #7
спасибо! у меня есть код который это делает, я не могу разобраться как он это делает на примере файла в hex-виде. вот код:
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
 // считаем кол-во кластеров по количеству байт равных 0x80
 
        while ( !feof(f) )
        {
            c1     = fgetc(f); // считываем байт
           _c1     = c1;
            slovo  = _c1 << 8; // запихиваем его в старшие разряды слова
            c2     = fgetc(f);
            slovo += c2;       // туда же запихиваем следующий считанный байт
 
            if ( (_c1 & 0xf0) == 0x80 ) // если слово начинается с 0x80
            {
                slovo = slovo & 0x0fff;
                i++; // то это начало кластера, счетчик "i" увеличиваем
            }
        }
 
        freq_num = i;
 
        // создаем массив класса-шаблона vector в количестве имеющихся кластеров
        if ( io ) delete[] io;
        io = new PARA[i];
        if ( io_prev ) delete[] io_prev;
        io_prev = new PARA[i];
 
        fseek(f, p, 0); // указатель устанавливаем на начало зоны данных
        ps = -1;
 
        // считываем данные в классы-шаблоны vector, объединенные в массив
 
        while ( !feof(f) )
        {
            c1     = fgetc(f);
           _c1     = c1;
            slovo  = _c1 << 8;
            c2     = fgetc(f);
            slovo += c2; // считываем два байта и объединяем в одно слово
 
            // если начало кластера, то переходим (ps++) к новому вектору и
            // пишем данные в него
            if ( (_c1 & 0xf0) == 0x80 )
            {
                ps++;
                io[ps].insert(io[ps].end(), slovo);
            }
            // иначе записивыем данные в текущий вектор
            else
            {
                io[ps].insert(io[ps].end(), slovo);
            }
        }// while ( !feof(f) )
как он это делает мне не понятно, я пытаюсь на примере файла пройти по коду так сказать "вручную" у меня ничего не получается, не хватает умишка) уже весь инет облазила с описанием данных функций, все равно ничего не получается
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.10.2012, 09:50 #8
Вот этот код считает из файла, вашего вида, каждое слово (как значение int) в вектор. 80 заменяется на 00.
Код
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
#include<iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
 
int main()
{
ifstream f("file.txt");
 
stringstream s;
string str;
string str1;
string str2;
vector <int> v;
 
while (!f.eof())
{
    char ch;
    while (f.get(ch)) // пропускаем до ':'
        if (ch == ':') break;
    for (int i = 0; i < 8; i++) // читаем 8 пар строк
    {
        f >> str1 >> str2;
        if (str1 == "80") str1 = "00"; // 80 заменяем на 00
            str = str1 + str2;
        int a = 0;
        s << hex << str; // помещаем строку как число в hex виде
        s >> a; // извлекаем десятичное чсло
        s.clear();
        v.push_back(a); // число в вектор
    }
}
 
for (int i = 0; i < v.size(); i += 8) // выводим вектор по 8 чисел в строке
{
    for (int j = i; j < i + 8; j++)
    {
        cout << v[j] << " ";
    }
    cout << endl;
}
 
 system("pause");
 return 0;
}
Больше не знаю, что предложить. Координаты Y не понятны. Если коорднаты X, как я понял, задаются одним байтом, то Y двумя? К тому, что большие получаются. В конце второй строки, координата X = 80 03 (03), а следующая Y = 25 00 (9472). Так и должно быть?
0
kiruhka
1 / 1 / 0
Регистрация: 08.09.2009
Сообщений: 103
15.10.2012, 09:55  [ТС] #9
там все координаты збозначаются 2 байтами, вложу пример файла, там все правильно
0
Вложения
Тип файла: doc starie_041605_1255.doc (83.5 Кб, 8 просмотров)
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.10.2012, 10:28 #10
Цитата Сообщение от kiruhka Посмотреть сообщение
там все координаты збозначаются 2 байтами
Я понимаю, что двумя, но вы сами написали в 5 посте, что для X первый байт только метка, на значение координаты не влияет. По идее координата Y не может быть больше 255, то есть первый байт всегда 0. Вы свой пример текста в файле (1 пост) сами придумали или из файла, выложенного в последнем посте, взяли? Я там таких координат Y (после координат X) не увидел.

Добавлено через 24 минуты
Цитата Сообщение от kiruhka Посмотреть сообщение
там все координаты збозначаются 2 байтами, вложу пример файла, там все правильно
Если там всё правильно, то что это:
0000000460: 00 62 01 78 00 66 01 7° │ 00 6C 01 84 00 68 01 85
Что за 7° ?
0
kiruhka
1 / 1 / 0
Регистрация: 08.09.2009
Сообщений: 103
15.10.2012, 11:19  [ТС] #11
В посте 1 пример файла придуман, настоящий файл на котором я пытаюсь понять код я выложила. Да в координате Х 80 это всего лишь метка, дальше идут чередование Y и значения A. И так до следующей метки

Добавлено через 47 минут
Если там всё правильно, то что это:
0000000460: 00 62 01 78 00 66 01 7° │ 00 6C 01 84 00 68 01 85
Что за 7° ?

7° это 7С это word исправил, я не заметила
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.10.2012, 11:57 #12
В файле, 80 встречается пять раз:
...
80 01 00 01 00 27
...
80 02 00 01 00 21
...
80 03 00 01 00 1E
...
80 04 00 01 00 1F
...
80 05 00 01 00 1C
...
Что с этим нужно сделать? С остальным?
0
kiruhka
1 / 1 / 0
Регистрация: 08.09.2009
Сообщений: 103
16.10.2012, 04:23  [ТС] #13
Это 5 координат Х, далее идет Y и значения А и это все надо вписать в массив, например Т[X][Y] = A. но загвостка в том, что количество X известно и количество Y известно, оно = 512, но те Y в которых А не равно 0 записаны в файле. Например Х=80 01,
далее Y=00 01 A=00 27
Y=00 02 A=00 66
Y=00 03 A=0
..................... и так далее до
Y=00 C0 A=00 8
И так далее до Х=80 02
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.10.2012, 06:01 #14
Цитата Сообщение от kiruhka Посмотреть сообщение
Это 5 координат Х, далее идет Y и значения А и это все надо вписать в массив, например Т[X][Y] = A
С этими пятью, будем считать, что понятно. Дальше, через одну (до следующего X) идут координаты Y и значения A. Что с ними делать? Что делать с теми числами, которые идут до первого X? Как этот файл создавался? Что за данные в нём ? Координаты - это координаты чего? Цель извлечения данных из файла? Массив, с извлечёнными данными, будет как-то использоваться?

Добавлено через 1 минуту
Цитата Сообщение от kiruhka Посмотреть сообщение
количество X известно и количество Y известно, оно = 512
Откуда известно?

Добавлено через 11 минут
В файле всего 512 байтов. Как может быть X + Y = 512? На каждую координату идут по два байта, плюс значения А.
0
kiruhka
1 / 1 / 0
Регистрация: 08.09.2009
Сообщений: 103
16.10.2012, 07:54  [ТС] #15
Числа которые идут до первого Х можно отбросить, они нужны для другого.
Что в нем зашифровано, это ионограмма, надеюсь это что-то скажет. формат создавался давно, меня ещё далеко в помине не было. Y известно потому что это конечное количество точек на графике, если представить как график.Или представим как прямоугольник, в котором длина это Х, а ширина это Y. Данный массив это главный массив программы, и он будет использоватьсчя везде где только можно.
0
16.10.2012, 07:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2012, 07:54
Привет! Вот еще темы с ответами:

Как считывать из файла цифры не в char, а в int - C++
Здравствуйте, люди добрые! Я записываю статистику количества встречающихся в тексте букв в файл, ещё я в него записываю закодированные...

Как можно считывать инфу с файла в виде массива строк? - C++
Возникла проблема в написании программы, суть в том что я ввожу инфу в файл, все норм записует... а когда считую ее назад получается...

Как записывать и считывать не POD типы данных из бинарного файла? - C++
Есть класса в котором часть полей не базовых динамических типов например vector list и подобные. Как записать экземпляр класса в бинарный...

Как лучше обрашаться к байтам int ? - C++
надо реализовать aes, что уже было сделано но встал вопрос: при операциях над словами - умножение, таблица подстоновки, сдвиг как лучше...


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

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

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