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

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

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

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

15.10.2012, 07:20. Просмотров 2075. Ответов 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.
Объяснила как могла. Помогите пожалуйста!
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 битные блоки),не очень хорошо...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5417 / 4813 / 442
Регистрация: 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 минуты
И как такое задание, вообще, может говориться на словах? Хотелось бы услышать те слова... Вы уверены, что всё правильно поняли со слов?
kiruhka
1 / 1 / 0
Регистрация: 08.09.2009
Сообщений: 103
16.10.2012, 08:36  [ТС] #17
я пытаюсь объяснить, но видать у меня это плохо выходит.\
то что я отправила это кусок огромного файла, на этом куске я проверяла "в ручную" работу кода, который выше в постах.
Давайте оставим эту тему. Помогите пожалуйста понять тот код, он делает то что я пытаюсь получить, но я не понимаю как он это делает
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.10.2012, 08:46 #18
Цитата Сообщение от kiruhka Посмотреть сообщение
Давайте оставим эту тему.
Давайте. По коду (если имеется ввиду код из 7 поста) создайте отдельную тему. Например: "Что делает данный код?" Наверняка помогут.
kiruhka
1 / 1 / 0
Регистрация: 08.09.2009
Сообщений: 103
16.10.2012, 09:20  [ТС] #19
Спасибо вам большое, что помучались со мной, а темку я создам
alsav22
5417 / 4813 / 442
Регистрация: 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 просмотров)
alsav22
5417 / 4813 / 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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2012, 14:36
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.10.2012, 14:36
Ответ Создать тему
Опции темы

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