Форум программистов, компьютерный форум CyberForum.ru

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

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

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

15.10.2012, 07:20. Просмотров 1995. Ответов 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.
Объяснила как могла. Помогите пожалуйста!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2012, 14:36     Как считывать информация с файла по байтам
Еще ссылки по теме:
C++ Как можно считывать инфу с файла в виде массива строк?
C++ Как записывать и считывать не POD типы данных из бинарного файла?
C++ Как лучше обрашаться к байтам int ?
как сделать что бы информация из файла бралась рандомно C++
Считывать линейный массив из файла C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.10.2012, 14:36     Как считывать информация с файла по байтам #21
Если же хотите сохранить данные в массиве в том же виде, как они выглядят в файле (без перевода в десятичную систему), то:
Код
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
// Запись в массив векторов данных из файла. 
// В каждый вектор записываются данные, начиная со слова 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)
{
    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 <string> *p = new vector <string>[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; // создаём слово
            
            p[i].push_back(str); // помещаем число в вектор
            
            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;
}
Yandex
Объявления
16.10.2012, 14:36     Как считывать информация с файла по байтам
Ответ Создать тему
Опции темы

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