Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
4epB9Ik
4 / 4 / 0
Регистрация: 13.06.2013
Сообщений: 20
#1

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

15.06.2017, 07:47. Просмотров 897. Ответов 11
Метки нет (Все метки)

Доброго времени суток.
Столкнулся с задачкой которую не могу правильно решить.

Вообщем к сути:

Есть бинарный файл в конец которого записанны 4 байта данных типа int, данное число является указателем на начало нужных мне данных (байты полученные из текста (String))

Необходимо считать этот указатель, переместиться в нужную позицию, и считать все данные с нужной позиции по (конец - 4), перевести это дело в string и уже работать с этим текстом дальше..

Нюансы:
- Целиком файл читать нельзя, дабы файл может быть огромных размеров, а в моем случае важна максимально быстрая обработка данных для выполнения последующей работы


Гуляя по просторам интернетов перечитал тонну гайдов и всеравно нечего не смог..
(Слишком мешают вредные привычки с других я.п (C#, Java)

Подскажите что я делаю не так, и как мне правильно работать с типами данных (int, string) в среде C++

Мой код:
C++
1
2
3
4
5
6
7
8
9
ifstream is;
int buffer[4] = {};
is.open(FilePath, ios::binary);
is.seekg(0, ios::end);
is.seekg(static_cast<int>(is.tellg()) - 4);
is.read((char*)&buffer, 4);
is.close();
    
    MessageBoxW(NULL, (LPCWSTR) buffer, L"Уведомление", MB_OK | MB_ICONINFORMATION);
- пытаюсь вынуть указатель и вывести его в message box. (результат - китайщина[unicode кракозябры] xD)

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.06.2017, 07:47
Ответы с готовыми решениями:

Удалить часть байтов из бинарного файла
Доброе утро! Я хочу написать функцию удаления части бинарного файла. Просто...

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

Чтение бинарного файла
Помогите, пожалуйста, научите, как правильно читать файлы! Есть бинарный файл....

Чтение бинарного файла
Добрый Добавлено через 6 минут Добрый день. Не получается прочитать бин....

Чтение бинарного файла
подскажите пожалуйста как можно из любого файла(*.bmp, *.mp3, *.avi и т.д.)...

11
RunningMan
161 / 137 / 63
Регистрация: 12.04.2017
Сообщений: 502
Записей в блоге: 2
15.06.2017, 08:01 #2
Цитата Сообщение от 4epB9Ik Посмотреть сообщение
файл в конец которого записанны 4 байта данных типа int
4epB9Ik, сначала нужно определится что считать. байты или int-ы
Наверно всё же 4 байта.
0
4epB9Ik
4 / 4 / 0
Регистрация: 13.06.2013
Сообщений: 20
15.06.2017, 08:09  [ТС] #3
Читать нужно именно байты, потому что данные типа Int переведены в байты на этапе записи.
Конкретней:
прочитать последних 4 байта -> перевести в Int. ->
Переместиться в позицию (переведенный Int) -> прочитать байты до (конец - 4) -> перевести в String
0
RunningMan
161 / 137 / 63
Регистрация: 12.04.2017
Сообщений: 502
Записей в блоге: 2
15.06.2017, 08:15 #4
Цитата Сообщение от 4epB9Ik Посмотреть сообщение
прочитать последних 4 байта -> перевести в Int. ->
так читайте сразу тип вам необходимый, массив байт тут не нужен
C++
1
2
int val = 0;
is.read(&v, sizeof(v));
1
4epB9Ik
4 / 4 / 0
Регистрация: 13.06.2013
Сообщений: 20
15.06.2017, 08:25  [ТС] #5
Пытался...
Результат:
http://f6.s.qip.ru/kJcLD7G4.png
0
nmcf
6259 / 5571 / 2531
Регистрация: 14.04.2014
Сообщений: 23,451
15.06.2017, 08:30 #6
C++
1
is.read(reinterpret_cast<char *>(&v), sizeof(v));
Перемещение вот так должно работать:
C++
1
is.seekg(-4, ios::end);
1
GbaLog-
Любитель чаепитий
3160 / 1466 / 462
Регистрация: 24.08.2014
Сообщений: 5,190
Записей в блоге: 1
Завершенные тесты: 2
15.06.2017, 08:34 #7
Цитата Сообщение от 4epB9Ik Посмотреть сообщение
Результат
картинки загружай на форум.
uBlock Origin has prevented the following page from loading:
http://f6.s.qip.ru/kJcLD7G4.png
и правила прочитай.
1
4epB9Ik
4 / 4 / 0
Регистрация: 13.06.2013
Сообщений: 20
15.06.2017, 08:42  [ТС] #8
Повторил по твоему варианту..

В итоге Crash процесса.
Сам код таков
C++
1
2
3
4
5
6
7
8
9
ifstream is;
    int buffer = 0;
 
    is.open(DllPath, ios::binary);
    is.seekg(-4, ios::end);
    is.read(reinterpret_cast<char *>(&buffer), sizeof(buffer));
    is.close();
    
    MessageBoxW(NULL, (LPCWSTR) buffer, L"Уведомление", MB_OK | MB_ICONINFORMATION);
0
nmcf
6259 / 5571 / 2531
Регистрация: 14.04.2014
Сообщений: 23,451
15.06.2017, 09:32 #9
4epB9Ik, Что ты получить-то хочешь? buffer - число, его нельзя выводить как строку.
C++
1
2
3
wchar_t s[100];
wsprintf(s, 100, L"%i", buffer);
MessageBoxW(NULL, s, L"Уведомление", MB_OK | MB_ICONINFORMATION);
0
4epB9Ik
4 / 4 / 0
Регистрация: 13.06.2013
Сообщений: 20
15.06.2017, 10:24  [ТС] #10
Ну вот я и пытаюсь преобразовать число в символы чтоб можно было использовать это число как текст
Вывести это число на экран так сказать.

в C# все просто buffer.toString() преобразует число в строку
Тут же танцы какие то с бубном..

(Да и вообще число в моем случае не обязательно выводить, это я так для удостоверения что там нужное число лежит, дабы возможности отлаживать код нет.
Это число означает позицию с которой нужно читать данные из файла, вот с этими данными уже нужно работать в дальнейшем как со строкой.. нарезать и т.д)

p.s чтоб понимать о чем идет речь оставлю функцию написанную на C# которая записывает все данные в этот файл
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 private void write_to_file(string data, string file_path)
        {
            using (FileStream fs = File.OpenWrite(file_path))
            {
                fs.Position = fs.Length;
                int startPos = (int)fs.Position;
 
                byte[] settingsData = Encoding.UTF8.GetBytes(data);
                byte[] posData = BitConverter.GetBytes(startPos);
 
                fs.Write(settingsData, 0, settingsData.Length);
                fs.Write(posData, 0, posData.Length);
            }
        }
0
nmcf
6259 / 5571 / 2531
Регистрация: 14.04.2014
Сообщений: 23,451
15.06.2017, 10:44 #11
Лучший ответ Сообщение было отмечено 4epB9Ik как решение

Решение

Цитата Сообщение от 4epB9Ik Посмотреть сообщение
в C# все просто buffer.toString() преобразует число в строку
C++
1
MessageBoxW(NULL, std::to_wstring(buffer).c_str(), L"Уведомление", MB_OK | MB_ICONINFORMATION);
1
4epB9Ik
4 / 4 / 0
Регистрация: 13.06.2013
Сообщений: 20
15.06.2017, 11:01  [ТС] #12
Цитата Сообщение от nmcf Посмотреть сообщение
C++
1
MessageBoxW(NULL, std::to_wstring(buffer).c_str(), L"Уведомление", MB_OK | MB_ICONINFORMATION);
Отлично.. число получаемое в буфер верное, вывести на экран удалось. Половина задачи решена..
Низкий поклон тебе :3

Теперь нужно переместиться в позицию <buffer> и прочитать все до <end - 4>
перевести прочитанное в string, для вывода на экран или любой другой обработки
0
15.06.2017, 11:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.06.2017, 11:01

Чтение бинарного файла
как получить доступ к произвольному адресу файла? Нужно отправить файл через...

Чтение бинарного файла
Здравствуйте. Есть код чтения бинарного файла: FILE *f; string tmp; char...

Чтение бинарного файла
Привет! Необходима помощь в таком вопросе - Создал программу для хранения...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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