Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
5 / 0 / 0
Регистрация: 08.07.2016
Сообщений: 10

Преобразование бинарного файла

08.07.2016, 13:03. Показов 3572. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Имеется файл, представляющий из себя сплошной текст из предложений, никак между собой не разделенных. В начале файла идет хедер, в котором для каждого предложения имеется заголовок по 8 байт, в котором есть указатели на начало нового предложения. Я хочу написать программу, которая бы могла бы из такого файла сделать полноценный текстовик, где каждое предложение начиналось бы с новой строки.
Указатели выглядят так:
10 03 1b 00 01 00 d8 00
2c 03 19 00 09 00 c8 00
ba 03 15 00 01 00 58 00
d3 03 1a 00 01 00 80 00
f1 03 14 00 02 00 a0 00
18 04 18 00 08 00 cc 00 ...
Где 10 03 это 0x310(little-endian) - начало первого предложение, а 2c 03 (0x32c) начало второго и т. д. количество может быть разным.
Буду рад любой помощи, так как извлечение данных из файла у меня на данный момент на нулевом уровне.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.07.2016, 13:03
Ответы с готовыми решениями:

Чтение из бинарного файла и преобразование строк в int
Всем доброго времени суток, столкнулся с такой вот проблемой. У меня есть бинарный файл со следующей структурой: N - число эл-тов...

Создание бинарного дерева из бинарного файла
struct Bin { string name; string city; int players; int score; }; void ReadFromBin(Point*& Tree) { Bin q;

Создание бинарного дерево из бинарного файла
struct Bin { string name; string city; int players; int score; }; void ReadFromBin(Point*& Tree) { ...

14
Модератор
 Аватар для vxg
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
08.07.2016, 13:53
Prizvel
1 читаете заголовок (я не знаю где он у вас кончается, может у заголовка есть в начале длина или он фиксированной длины или заголовок отделен от данных нулевым полем)
2 каждый WORD заголовка как я понял представляет собой смещение по которому лежит предложение (относительно чего это смещение я не знаю - относительно начала файла или начала данных)
3 длину предложения можно узнать предполагая что сразу за ним идет следующее предложение (правда, тогда последнее предложение потребует особой обработки)
4 перемещаемся по файлу через seekg(pos), считываем нужное количество байт, записываем их в новый файл
0
5 / 0 / 0
Регистрация: 08.07.2016
Сообщений: 10
08.07.2016, 14:12  [ТС]
vxg
1. Смещение указано относительно начала файла.
2. Заголовок может быть разной длины, в зависимости от количества предложений, но его длину легко определить по первым двум байтам, они указывают на начало текста, все что впереди - заголовок, он ничем не отделен и всегда кратен восьми (по восемь байт на каждое предложение в тексте)
3. Последнее предложение всегда пустое и служит только для указания конца предыдущего.
0
Модератор
 Аватар для vxg
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
08.07.2016, 14:40
Prizvel полный ответ, очень логичный формат. вы ненавязчиво предлагаете написать мне код)?
0
5 / 0 / 0
Регистрация: 08.07.2016
Сообщений: 10
08.07.2016, 14:51  [ТС]
vxg На данный момент моих знаний не достаточно для самостоятельного написания кода, поэтому конечно такой вариант мне бы очень подошел). Но спасибо и на этом, читаю матчасть и пробую через seekg(pos). Вообще я ранее правил это все ручками, вот решил попробовать автоматизировать.
0
Модератор
 Аватар для vxg
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
08.07.2016, 15:12
Prizvel вроде так но не тестировал
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
//---------------------------------------------------------------------------
 
#pragma hdrstop
 
//---------------------------------------------------------------------------
#include <fstream>
#include <windows.h>
#include <iostream>
#include <stdlib.h>
//---------------------------------------------------------------------------
 
#pragma argsused
int main(int argc, char* argv[])
{
    std::ifstream is("in.txt", std::ios::binary);
    std::ofstream os("out.txt", std::ios::binary);
 
    char buffer[1000];
 
    WORD pos_1;
    is.read((char *)&pos_1, sizeof(pos_1));
 
    WORD data = pos_1;
 
    int count = 0;
 
    while (true)
    {
        WORD pos_2;
        is.read((char *)&pos_2, sizeof(pos_2));
 
        WORD len = pos_2 - pos_1;
        if (len > sizeof(buffer))
        {
            std::cout << "len > sizeof(buffer)" << std::endl;
            break;
        }
 
        is.seekg(pos_1);
        is.read(buffer, len);
 
        os.write(buffer, len);
        os.write("\r\n", 2);
 
        pos_1 = pos_2;
 
        count++;
 
        if (count * 2 == data) break;
    }
 
    is.close();
    os.close();
 
    system("pause");
    return 0;
}
//---------------------------------------------------------------------------
1
5 / 0 / 0
Регистрация: 08.07.2016
Сообщений: 10
08.07.2016, 15:21  [ТС]
vxg Огромное спасибо. Увеличил размер баффера, стало получаться, правда на выходе у меня крякозябры, но с этим я уже как нибудь разберусь. Ещё раз спасибо!
0
Модератор
 Аватар для vxg
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
08.07.2016, 15:27
Prizvel, кракозябры это кодировка. код кодировку не меняет она должна быть той же самой.

Добавлено через 35 секунд
попробуйте на английском тексте или выложите тестовый файл сюда
0
5 / 0 / 0
Регистрация: 08.07.2016
Сообщений: 10
08.07.2016, 15:33  [ТС]
да, это я тупанул сам, не тот файл подкинул. Единственное что бы еще хотелось, что бы каждое предложение начиналось с новой строки. Для этого мне нужно в конец каждого предложения добавить байт, со значением 0a.
http://puu.sh/pUyJC/0f61fd66fe.txt - файл который я открываю.
0
Модератор
 Аватар для vxg
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
08.07.2016, 15:42
Prizvel, строка
C++
1
os.write("\r\n", 2);
как раз и отвечает за вставку переносов. возможно вашему редактору не нравится \r попробуйте без него (естественно длина станет 1)

Добавлено через 2 минуты
...что то там не так...
0
5 / 0 / 0
Регистрация: 08.07.2016
Сообщений: 10
08.07.2016, 15:45  [ТС]
Почему? Все вроде так, мне осталось только с переносами разобраться.
0
Модератор
 Аватар для vxg
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
08.07.2016, 15:50
Лучший ответ Сообщение было отмечено Prizvel как решение

Решение

...во первых я не считываю хвост из 6 байтов, а во вторых что-то все куда-то съезжает

Добавлено через 55 секунд
поэтому и буфера не хватает - он читает неверные позиции в результате вычитания которых получает адовое число

Добавлено через 1 минуту
и seekg перед чтением следующего заголовка я забыл сделать
вот так похоже
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
//---------------------------------------------------------------------------
 
#pragma hdrstop
 
//---------------------------------------------------------------------------
#include <fstream>
#include <windows.h>
#include <iostream>
#include <stdlib.h>
//---------------------------------------------------------------------------
 
#pragma argsused
int main(int argc, char* argv[])
{
    std::ifstream is("in.txt", std::ios::binary);
    std::ofstream os("out.txt", std::ios::binary);
 
    char buffer[1000];
 
    WORD pos_1;
    is.read((char *)&pos_1, sizeof(pos_1));
 
    WORD data = pos_1;
 
    int count = 1;
 
    while (true)
    {
        WORD pos_2;
        is.seekg(count * 8);
        is.read((char *)&pos_2, sizeof(pos_2));
 
        WORD len = pos_2 - pos_1;
        if (len > sizeof(buffer))
        {
            std::cout << "len > sizeof(buffer)" << std::endl;
            break;
        }
 
        is.seekg(pos_1);
        is.read(buffer, len);
 
        os.write(buffer, len);
 
        pos_1 = pos_2;
 
        count++;
 
        if (count * 8 == data) break;
    }
 
    is.close();
    os.close();
 
    system("pause");
    return 0;
}
//---------------------------------------------------------------------------
1
5 / 0 / 0
Регистрация: 08.07.2016
Сообщений: 10
08.07.2016, 15:52  [ТС]
Да, все супер! Теперь буду разбираться в Вашем коде, что бы иметь представление что к чему. Спасибо огромнейшее
0
Модератор
 Аватар для vxg
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
08.07.2016, 15:57
+в предложениях уже есть символы 0x0A - их не нужно добавлять

Добавлено через 49 секунд
про остальные артефакты в тексте у меня пока нет идей - там какие то символы аномальные

Добавлено через 53 секунды
почему то в началах строк лепят 01

Добавлено через 1 минуту
а иногда втыкают нулевой код
0
5 / 0 / 0
Регистрация: 08.07.2016
Сообщений: 10
08.07.2016, 16:01  [ТС]
Это нормально. Это текст из игры, которую я перевожу в свободное время. 01 там используется как перенос строки, 00 01, это означает новый диалог. Есть еще различные указатели на имена персонажей и тд. Конечно в идеале это все стоит менять на понятные глазу символы. Но да данном этапе Вы мне и так уже очень сильно помогли. В будущем, когда я буду вставлять текст обратно, я задумаюсь уже об автоматической замене этих байтов.
Пока попытаюсь на основе Вашего кода сделать обратную функцию
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.07.2016, 16:01
Помогаю со студенческими работами здесь

Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется
Формат файла состоит из 3 структур и одной переменной. Подробное описание формата во вложении, просьба посмотреть его. У меня возникла...

Преобразование бинарного файла в текстовый
Помогите пожалуйста. Есть бинарный файл. Известна структура и вид текстового(файлы прилагаются). Преобразовать, в принципе, типизированный...

Открытие бинарного файла и преобразование данных в dec
Доброго времени суток! Подскажите каким образом можно открыть бинарный файл вида &quot;*.txt&quot; и перевести данные в десятичную...

Преобразование бинарного кода в машинный
Есть строка, содержащая бинарный код (символы входного текста согласно ASCII таблице). Необходимо преобразовать эту строку в машинный код...

Перегрузка бинарного плюса и преобразование
Здравствуйте. Изучаю перегрузку операторов, наткнулся на странную вещь, которая не укладывается в голове. Получилось все случайно: делал...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru