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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Обработка векторов в неразветвленном цикле http://www.cyberforum.ru/cpp-beginners/thread671408.html
Помогите пожалуйста решить задачку... Задание. Составить и испытать циклическую программу для получения результата, указанного в заданном варианте задания. Всюду далее набор индексированных...
C++ [C++, OpenGL, glut] передача метода класса в качестве параметра функции glutDisplayFunc() Пишу программу для обхода бинаронго дерева поиска. Программа написана и кажется даже работает, но только в консоли. Решил выводить дерево на экран, для наглядности, используя OpenGL (как раз его в... http://www.cyberforum.ru/cpp-beginners/thread671402.html
C++ Сжать массив путём удаления нулей
Нужно написать программу которая сжимает массив путём удаления нулей (если они есть), не используя вспомагательный массив. Буду очень благодарен!!!!!
Есть ли аналог isalpha, только для string C++
Добрый вечер! Как проверить, что введены только буквы, без символов, isalpha не прокатило:curtsy: , тока для символов cout<<"enter a word:"<<endl; cin>>word; while (true) { if(isalpha(word)) ...
C++ Первый класс. Функция-член http://www.cyberforum.ru/cpp-beginners/thread671384.html
Добрый день! Пытаюсь собрать свой первый класс, но, кажется, не до конца понимаю всей сути. #include <stdio.h> #include <iostream> #include <string> #include <conio.h> #include <fstream> ...
C++ Массивы и циклы Суть задачи: Двумерный массив, содержащий равное число строк и столбцов, называется магическим квадратом, если суммы чисел, записанных в каждой строке, каждом столбце и каждой из двух больших... подробнее

Показать сообщение отдельно
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.10.2012, 14: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
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;
}
0
Вложения
Тип файла: txt file2.txt (4.2 Кб, 4 просмотров)
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru