Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.98/43: Рейтинг темы: голосов - 43, средняя оценка - 4.98
1 / 1 / 0
Регистрация: 06.08.2008
Сообщений: 55

Некорректно читаются данные из бинарного файла

30.08.2012, 01:00. Показов 9589. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
столкнулся с такой проблемой и не могу найти ей объяснение.
есть код читающий содержимое двоичного файла:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <fcntl.h>
#include <sys\stat.h>
char *bytef;
void read_f()
{
    FILE *openfile;
    openfile=fopen(path.c_str(),"rb");
    if (openfile)
    {
        struct stat statbuf;
        stat(path.c_str(),&statbuf);
        bytef=new char[statbuf.st_size];
        fread (bytef,statbuf.st_size,1,openfile);
    };
fclose(openfile);
}
}
чтение происходит без ошибок, но сделав паузу и просматривая содержимое переменной bytef наблюдаю
появление символов '\n' там где их в реале нет! при записи содержимого переменной в файл, обнаружил закономерность:
символ '\n' , 0D в шестнадцатиречиной системе, появляется только перед символом 0A который непечатаемый, но в файле есть! и после чтения из файла bytef становится больше на добавленное количество символов! сделал цикл вырезающий '\n' перед 0А, но при записи в файл у меня '\n' начало затирать байты перед 0А вобще бред какой-то... пробовал читать из файла и писать разными методами (read, fread) и в разные переменные просто мистика какая-то...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.08.2012, 01:00
Ответы с готовыми решениями:

Не читаются данные из txt-файла
5 3 2E5 1.7E5 0.001 0 1000 0.5 10 1000 0.5 10 1000 0.5 10 1000 0.5 10 1000 0.5 10 a b c d ...

Не читаются данные из файла
Всем привет. Такая проблема: надо считать из текстового документа некоторые числа. Использую OPEN и READ. Файл открывается, но оттуда...

Морской Бой консольный, данные читаются с файла, помогите с структурой! спс.
Здравствуйте! курс подходит к концу и нужно сдавать программки ((: я непрошу чтобы вы мне ее написали, просто помогите чисто теоретически,...

29
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
31.08.2012, 09:52
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от smertnik Посмотреть сообщение
у меня мысли такие: fwrite и write пишут по правилам из второго поста и поэтому добавляют 0D
Бинарное чтение\запись ничего не добавляет, в отличие от текстового. Во втором посте кода нет. Все другие ваши коды (1 и 9 пост) я проверил. Результат выложен. Если сейчас всё нормально работает, то можно на этом и остановиться, или выложите пример кода, где происходит что-то непонятное. Больше информации к размышлению нет.
1
 Аватар для ErikPshat
0 / 0 / 0
Регистрация: 26.08.2016
Сообщений: 76
01.03.2018, 02:29
У меня аналогичная проблема. Утилитка производит чтение размера из файла по такому-то адресу.
Размер файла естесственно записан в хейдере в бинарном виде = 0AFB0150.
Утилитка считывает эти данные из файла и пишет эти же данные в другой файл на выходе.
И что странно, все файлы различных размеров записываются корректно, а вот если размер начинается с 0A, как в данном примере, то спереди добавляется 0D. И количество байт становится больше на 1, что приводит к неработоспособности бинарного файла.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
01.03.2018, 02:49
ErikPshat, значит ты не в бинарном режиме открываешь файл, а в текстовом.
1
 Аватар для ErikPshat
0 / 0 / 0
Регистрация: 26.08.2016
Сообщений: 76
01.03.2018, 04:08
Не могли бы вы мне помочь исправить эту неприятность?
Во вложение я положил 2 небольших демо-файла, у которых размер начинается с 0A
Простейшая утилитка с одним маленьким исходником и готовая консольная. Она не поддерживает drag&drop, но тоже хотелось бы чтоб помогли.
Можете попробовать через консоль натравить эти демо на утилитку и на выходе появится папка с тремя файлами.
Там размеры прописываются в двух функциях друг за другом:
  • 0x000000D0 (функция) 0x00000008 (длина строки) 0x00000008 (длина строки) 0xFFFFFFFFFFFFFFFF (размер файла 8 байт).
  • 0x000000CE (функция) 0x00000008 (длина строки) 0x00000008 (длина строки) 0xFFFFFFFFFFFFFFFF (размер файла 8 байт).
В общем в исходнике всё увидите, думаю объяснять тут по ним не нужно.
Вложения
Тип файла: zip Bubble_Maker.zip (32.9 Кб, 15 просмотров)
0
Фрилансер
 Аватар для Black Fregat
3709 / 2083 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
01.03.2018, 04:28
ErikPshat, там нигде режим не указан вообще.
Всюду, где fopen(..., "r") и fopen(..., "w") нужно поставить fopen(..., "rb") и, соответственно, fopen(..., "wb")

Добавлено через 2 минуты
То есть, добавить в строку буквочку b - бинарный режим
1
 Аватар для ErikPshat
0 / 0 / 0
Регистрация: 26.08.2016
Сообщений: 76
01.03.2018, 04:43
Black Fregat, о, спасибо большое! Проверил, теперь всё работает.
Я понял, т.е. rb - read byte, wb - write byte. То есть идёт указание именно на чтение и запись бинарного кода.

А ещё по ходу не могли бы подсказать по поводу Drag & Drop? Чтобы просто кидать файл на экзешник. Я пытался и так и эдак, но никак не получается, одни ругательства )))
0
Фрилансер
 Аватар для Black Fregat
3709 / 2083 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
01.03.2018, 12:50
Какие ругательства? Прямо так должно работать, "из коробки", ничего менять не надо
0
 Аватар для ErikPshat
0 / 0 / 0
Регистрация: 26.08.2016
Сообщений: 76
01.03.2018, 20:28
Black Fregat, ой, прошу прощения, ввёл в заблуждение.
Функция "drag and drop" по факту работает. Это я что-то запамятовал. И вроде она как положено выполняется, то есть, подставляет в аргумент "Полный путь". Я так понимаю это здесь
C++
1
pkg = fopen (argv[1], "rb");
Но дело в том, что этот путь у меня так же прописывается в файл. А мне нужно прописывать туда только название файла.
То есть, нужно обрезать путь и при записи оставить только название.

Я думаю это что-то нужно химичить здесь в argv[1]:
C++
1
2
3
4
  write_pdb (out1, path, argv[1], argc >= 2 ? argv[2]: NULL,
      &pkg_header, htonl (HEADER5_MAGIC_VALUE));
  write_pdb (out2, path, argv[1], argc >= 2 ? argv[2]: NULL,
      &pkg_header, htonl (0));
Я же пока только новичок и пытаюсь разобраться, но вот как это реализовать?

Добавлено через 3 часа 37 минут
Ну так что, это не реально отрезать путь из аргумента argv[1]?

В батнике я знаю, что это довольно просто отрезать от полного пути %%~dpni только имя файла типа так %%~ni.
А вот в С++ до меня это как-то сложно доходит.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
01.03.2018, 21:50
Цитата Сообщение от ErikPshat Посмотреть сообщение
Ну так что, это не реально отрезать путь из аргумента argv[1]?
Реально, тему создай.
1
 Аватар для ErikPshat
0 / 0 / 0
Регистрация: 26.08.2016
Сообщений: 76
02.03.2018, 01:22
Цитата Сообщение от nd2 Посмотреть сообщение
Реально, тему создай.
Создал: Как отрезать путь из аргумента argv[1] и оставить только название файла?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.03.2018, 01:22

данные из файла считываются некорректно
Добрый день! Помогите понять, почему происходит следующая ситуация: В файле: 1 2 3 4.567 1 3 4 5 1 1 1 1 1 2 3 7 12 3 4 5 ...

Извлечь данные из бинарного файла
Написать функцию которая извлекает данные из из бинарного файла в структуру. Обязательный параметр - номер требуемой записи

Вытащить из бинарного файла определенные данные
Стоит задача вытащить из бинарного файла (3d моделька для игры) определенные данные (например имена и параметры определенных полей). В...

Как считать данные из бинарного файла в массив ArrayList
Делаю загрузку данных из серилизации , и него понять как из бинарного файла поместить данные в массив типа ArrayList что бы потом два...

Записать\прочесть данные в\из бинарного файла в инкапсулированну структуру
Здравствуйте форумчане. Как записать\прочесть данные в\из бинарного файла в инкапсулированну структуру такого вида? struct obj { ...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru