Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
1 / 1 / 3
Регистрация: 08.09.2009
Сообщений: 103
1

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

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

Author24 — интернет-сервис помощи студентам
У меня есть файл, выглядит как график, 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.10.2012, 07:20
Ответы с готовыми решениями:

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

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

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

Как считывать с файла данные блоками?
Есть код. Нужно считывать с файла информацию и подсчитать количество символов.Предусмотреть...

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

Добавлено через 2 минуты
Текст задания есть?
0
1 / 1 / 3
Регистрация: 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
5498 / 4893 / 831
Регистрация: 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
1 / 1 / 3
Регистрация: 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
5498 / 4893 / 831
Регистрация: 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
1 / 1 / 3
Регистрация: 08.09.2009
Сообщений: 103
15.10.2012, 09:55  [ТС] 9
там все координаты збозначаются 2 байтами, вложу пример файла, там все правильно
Вложения
Тип файла: doc starie_041605_1255.doc (83.5 Кб, 9 просмотров)
0
5498 / 4893 / 831
Регистрация: 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
1 / 1 / 3
Регистрация: 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
5498 / 4893 / 831
Регистрация: 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
1 / 1 / 3
Регистрация: 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
5498 / 4893 / 831
Регистрация: 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
1 / 1 / 3
Регистрация: 08.09.2009
Сообщений: 103
16.10.2012, 07:54  [ТС] 15
Числа которые идут до первого Х можно отбросить, они нужны для другого.
Что в нем зашифровано, это ионограмма, надеюсь это что-то скажет. формат создавался давно, меня ещё далеко в помине не было. Y известно потому что это конечное количество точек на графике, если представить как график.Или представим как прямоугольник, в котором длина это Х, а ширина это Y. Данный массив это главный массив программы, и он будет использоватьсчя везде где только можно.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
16.10.2012, 08:33 16
Цитата Сообщение от kiruhka Посмотреть сообщение
Y известно потому что это конечное количество точек на графике
Как их может быть 512, если в файле всего 512 байт? Если по два байта на значение, то получается 256 значений. В них пять значений X, сколько то А, остальное Y. И как тогда значений Y может быть 512?
Цитата Сообщение от alsav22 Посмотреть сообщение
С этими пятью, будем считать, что понятно. Дальше, через одну (до следующего X) идут координаты Y и значения A. Что с ними делать?
Хотелось бы и на этот вопрос ответ получить. Если вы не проясните задачу (в том числе и для себя), то вам никто не сможет помочь.

Добавлено через 4 минуты
И как такое задание, вообще, может говориться на словах? Хотелось бы услышать те слова... Вы уверены, что всё правильно поняли со слов?
0
1 / 1 / 3
Регистрация: 08.09.2009
Сообщений: 103
16.10.2012, 08:36  [ТС] 17
я пытаюсь объяснить, но видать у меня это плохо выходит.\
то что я отправила это кусок огромного файла, на этом куске я проверяла "в ручную" работу кода, который выше в постах.
Давайте оставим эту тему. Помогите пожалуйста понять тот код, он делает то что я пытаюсь получить, но я не понимаю как он это делает
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
16.10.2012, 08:46 18
Цитата Сообщение от kiruhka Посмотреть сообщение
Давайте оставим эту тему.
Давайте. По коду (если имеется ввиду код из 7 поста) создайте отдельную тему. Например: "Что делает данный код?" Наверняка помогут.
1
1 / 1 / 3
Регистрация: 08.09.2009
Сообщений: 103
16.10.2012, 09:20  [ТС] 19
Спасибо вам большое, что помучались со мной, а темку я создам
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
16.10.2012, 14:21 20
Вот этот код делает то же самое, что и код, с которым вы пытаетесь разобраться. Помощи, я так понял, вам не дождаться. Очень трудно разобраться, если вопрос туманный. Файл, который этот код корректно обрабатыает, я прилагаю для проверки. От вашего (выложенного) он отличается тем, что убран символ '|' из части с данными.
Код
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// Запись в массив векторов данных из файла, с преобразованием из шестнадцатиричной системы 
// в десятичную. В каждый вектор записываются данные, начиная со слова 0x80 и до следующего слова 0x80
// Файл должен быть такого формата:
//....
// 00000001C0:     20  32  30  2E  32  30  20  AA  83  E6  0A  0A  00  00  00  00       
// 00000001D0:     80  01  00  01  00  27  00  02  00  66  00  C0  00  87  00  CA   
// 00000001E0:     00  6E  00  CB  00  6E  00  EF  00  67  01  05  00  88  01  2F       
// ....
// Количество пробелов не важно, но других символов, в части с данными, не должно быть, или тогда
// нужно делать дополнительную проверку.
 
#include<iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
 
void f1(istream &f, int &flag) // функция проверяет равно ли следующее слово 0x80. Если да то flag = 0;
{
    char ch, ch1;
    while (f.get() == ' '); // читаем до символа
    f.seekg(-1, ios::cur); // возврат курсора на начало строки с данными
    // проверяем следующие два символа
    ch = f.peek();
    f.seekg(1, ios::cur);
    ch1 = f.peek();
            
    if (ch == '8' && ch1 == '0') flag = 0; // если следующие два символа 8 и 0 , то обнуляем flag
    f.seekg(-1, ios::cur); // возврат курсора после проверки
}
 
int main()
{
ifstream f("file2.txt", ios::binary);
 
stringstream s;
string str1;
string str2;
string str;
 
int c = 0; // счётчик для слова 0x80
char ch, ch1;
 
while (!f.eof()) // подсчёт количества слов 0x80 в файле
{
    while (f.get(ch)) // пропускаем до ':'
        if (ch == ':') break;
    
    for (int i = 0; i < 8; i++) // читаем 8 пар строк
    {
        f >> str1 >> str2;
        if (str1 == "80")  c++; // если найдено слово 0x80
    }
}
 
f.clear();
f.seekg(0, ios::beg); // курсор в начало
 
vector <int> *p = new vector <int>[c]; // динамический массив векторов
 
int i = -1; // индекс массива векторов
int flag = 0;
 
while (!f.eof())
{
    while (f.get(ch)) // читаем до ':'
        if (ch == ':') break;
 
    f1(f, flag);
    
    for (int j = 0; j < 8; j++) // читаем 8 слов
    {
        f >> str1 >> str2;
        if (str1 == "80" && flag == 0) // если первое слово 0x80 и flag = 0
        {
            str1 = "00"; // 0x80 заменяем на 00
            flag = 1; 
            i++; 
        }
        if (flag == 1)
        {
            str = str1 + str2; // создаём слово
            int a = 0;
            s << hex << str; // помещаем слово как число в hex виде в поток
            s >> a; // извлекаем десятичное число
            s.clear();
            
            p[i].push_back(a); // помещаем число в вектор
            
            f1(f, flag);
        }
    }
}
 
for (int i = 0; i < c; i++) // вывод размера и содержимого векторов
{
    cout << "vector " << i << "(size = " << p[i].size() << "):" << endl << endl;
    for (int j = 0; j < p[i].size(); j++)
    {
         cout << p[i][j] << " ";
    }
    cout << endl << endl;
}
 
f.close();
 
delete [] p;
 
system("pause");
return 0;
}
Вложения
Тип файла: txt file2.txt (4.2 Кб, 4 просмотров)
0
16.10.2012, 14:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.10.2012, 14:21
Помогаю со студенческими работами здесь

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

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

Как считывать только числа из текстового файла?
необходимо считать из текстового файла числа в массив. но если в файле будут еще и буквы, то...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru