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

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

Войти
Регистрация
Восстановить пароль
 
4epB9Ik
4 / 4 / 1
Регистрация: 13.06.2013
Сообщений: 20
#1

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

15.06.2017, 07:47. Просмотров 217. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чтение байтов из бинарного файла (C++):

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

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

Чтение из бинарного файла - C++
Всем приветы. Подскажите или помогите, пожалста. Есть вот такая штука: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

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

Чтение бинарного файла - C++
как получить доступ к произвольному адресу файла? Нужно отправить файл через ком порт но не с 0 а с адреса 1а000 в цикле по 0х100 байт. с 0...

Чтение из бинарного файла - C++
Создала Базу данных. запись в файл происходит, а чтение из файла не получается. исправьте, пожалуйста, или подскажите как? #include...

11
RunningMan
153 / 129 / 43
Регистрация: 12.04.2017
Сообщений: 447
Записей в блоге: 2
15.06.2017, 08:01 #2
Цитата Сообщение от 4epB9Ik Посмотреть сообщение
файл в конец которого записанны 4 байта данных типа int
4epB9Ik, сначала нужно определится что считать. байты или int-ы
Наверно всё же 4 байта.
0
4epB9Ik
4 / 4 / 1
Регистрация: 13.06.2013
Сообщений: 20
15.06.2017, 08:09  [ТС] #3
Читать нужно именно байты, потому что данные типа Int переведены в байты на этапе записи.
Конкретней:
прочитать последних 4 байта -> перевести в Int. ->
Переместиться в позицию (переведенный Int) -> прочитать байты до (конец - 4) -> перевести в String
0
RunningMan
153 / 129 / 43
Регистрация: 12.04.2017
Сообщений: 447
Записей в блоге: 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 / 1
Регистрация: 13.06.2013
Сообщений: 20
15.06.2017, 08:25  [ТС] #5
Пытался...
Результат:
http://f6.s.qip.ru/kJcLD7G4.png
0
nmcf
5545 / 4855 / 1647
Регистрация: 14.04.2014
Сообщений: 19,715
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-
Любитель чаепитий
3031 / 1399 / 338
Регистрация: 24.08.2014
Сообщений: 4,968
Записей в блоге: 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 / 1
Регистрация: 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
5545 / 4855 / 1647
Регистрация: 14.04.2014
Сообщений: 19,715
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 / 1
Регистрация: 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
5545 / 4855 / 1647
Регистрация: 14.04.2014
Сообщений: 19,715
15.06.2017, 10:44 #11
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 4epB9Ik Посмотреть сообщение
в C# все просто buffer.toString() преобразует число в строку
C++
1
MessageBoxW(NULL, std::to_wstring(buffer).c_str(), L"Уведомление", MB_OK | MB_ICONINFORMATION);
1
4epB9Ik
4 / 4 / 1
Регистрация: 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
Привет! Вот еще темы с ответами:

Чтение бинарного файла - C++
Подскажите пожалуйста как можно правильно открыть бинарный файл не зная структуры? С чего мне начать? Вот пример:

Чтение бинарного файла - C++
подскажите пожалуйста как можно из любого файла(*.bmp, *.mp3, *.avi и т.д.) получить двоичное представление этого файла или хотя бы считать...

Чтение из бинарного файла - C++
Здравствуйте. У меня имеется некий класс Product, объекты которого хранятся в объекте класса Vector. Есть функция записи вектора в бинарный...

Чтение бинарного файла - C++
Здравствуйте. Есть код чтения бинарного файла: FILE *f; string tmp; char buff = {0}; f = fopen(&quot;data.bin&quot;, &quot;rb&quot;); if(f ==...


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

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

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