Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 23

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

17.11.2013, 01:16. Показов 2421. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток всем!
Подскажите, что-то впадаю в ступор.
Есть бинарный файл:

Задача, найти байты 0хЕ3 и выполнить определенные операции (например, вывести вывести окно "!!!!")
Открываю файл и читаю его данные в буфер:
Code
1
2
3
4
5
6
7
8
// Открываем файл с данными
char buff [100002];
DWORD readbytes=GetFileSize(_T("TestFile.dat"),NULL);
DWORD tmp;
ReadFile(_T("TestFile.dat"), buff, readbytes, &tmp, NULL);
 
if (buff[0]=0xE3)
    AfxMessageBox(_T("!!!!"));
Проблема в том, что данные читаются неправильно.
Каким бы ни было значение buff[0], условие считается верным и окошко выводится.
Даже если поставить
Code
1
if (buff[0]!=0xE3)
Окно выводится. Хотя я точно знаю, что 0-й байт равен 0xE3
В чем ошибка?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.11.2013, 01:16
Ответы с готовыми решениями:

Открытие бинарного файла MFC
Добрый вечер, друзья. Рискну создать тему, вопрос уже поднимался, но предложенные методы решения мне не помогли. Имею бинарный файл....

Чтение файла в MFC
Есть текстовый файл TConfiguration.txt. В нем следующая информация UID=2806FA4F01000066=1 UID=28AA2A50010000BB=2 Обратите...

Чтение из файла MFC
Ребят, пишу на с++ с использованием MFC. Читаю из файла с помощью CStdioFile. Строку записываю TCHAR. Проблема в том,что вместо русских...

8
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
17.11.2013, 02:23
if (buff[0]=0xE3)
* *
У вас присваивание
0
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 23
17.11.2013, 02:31  [ТС]
MrCold
Вы правы, этот "бок" я уже устранил.
Code
1
2
if (buff[0]==0xE3)
AfxMessageBox("???");
Теперь другая крайность.
Почему-то не видится значение 0хЕ3, хотя точно знаю, что 0-й байт равен 0хЕ3
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
19.11.2013, 17:39
Первый параметр ReadFile() - HANDLE (дескриптор файла), а не имя файла. Для получения дескриптора используется функция CreateFile().
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
    //
    // open existing file 
    //
    HANDLE hFile = CreateFile(_T("a.txt"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING /*OPEN_ALWAYS*/, 0, NULL);    
    if (hFile == INVALID_HANDLE_VALUE)
    {
        ::MessageBox(NULL,_T("Ошибка открытия файла"),_T("Error"), MB_OK);
        return;
    }   
    DWORD readbytes = GetFileSize(hFile, NULL);
    if( readbytes == INVALID_FILE_SIZE )
    {
        // error 
        // ...
    }
 
    //
    // read 
    //
    char buff [100002];
    DWORD tmp = 0;
    BOOL b = ReadFile( hFile, buff, readbytes, &tmp, NULL);
    if( ! b )
    {
        // error
        DWORD dw = GetLastError();
        ::MessageBox(NULL,_T("Ошибка чтения "),_T("Error"), MB_OK);
    }
 
    //
    // close 
    //
    CloseHandle( hFile );
1
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 23
19.11.2013, 22:44  [ТС]
Код подправил, все работает.
Однако есть одно маленькое "но", которое не получается устранить.
Код:
Code
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
// Открываем файл с данными
    HANDLE hFile = CreateFile(_T("TestFile.dat"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING /*OPEN_ALWAYS*/, 0, NULL);    
    if (hFile == INVALID_HANDLE_VALUE)
    {
        ::MessageBox(NULL,_T("Ошибка открытия файла"),_T("Error"), MB_OK);
        return;
    }   
    DWORD readbytes = GetFileSize(hFile, NULL);
    char buff [100002];
    DWORD tmp = 0;
    BOOL b = ReadFile( hFile, buff, readbytes, &tmp, NULL);
    if( ! b )
    {
        // error
        DWORD dw = GetLastError();
        ::MessageBox(NULL,_T("Ошибка чтения "),_T("Error"), MB_OK);
    }
 
if (buff[0]==0xE3)
{AfxMessageBox("0");}
if (buff[1]==0xE3)
{AfxMessageBox("1");}
if (buff[2]==227)
{AfxMessageBox("2");}
if (buff[3]==0x8A)
{AfxMessageBox("3");}
if (buff[4]==0x06)
{AfxMessageBox("4");}
if (buff[5]==0)
{AfxMessageBox("5");}
else
{AfxMessageBox("???");}
 
    CloseHandle( hFile );
}
У меня срабатывают только условия:
Code
1
2
3
4
if (buff[4]==0x06)
{AfxMessageBox("4");}
if (buff[5]==0)
{AfxMessageBox("5");}
А вот значения в НЕХ-виде (0xE3) или в десятичном (227) не видятся в упор.
Чего не дописал?
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
20.11.2013, 17:34
Видимо, причина в том, что в C++ тип char - знаковый ( диапазон от -128 до 127 ).
C++
1
2
        char ch = 227;  // в результате ch равняется  -29 
        bool b = ( ch == 227 ); // false,  так как  -29 != 227
А вот значения в НЕХ-виде (0xE3) или в десятичном (227) не видятся в упор.
Чего не дописал?
Можно вместо char использовать unsigned char.
C++
1
2
unsigned char buff[100002];
if (buff[0]==0xE3)
Другой вариант - добавить явное приведение типа.
C++
1
2
char buff[100002];
if (buff[0]==(char)0xE3)
1
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 23
20.11.2013, 23:53  [ТС]
Alex5,
Спасибо большое.
Похоже все заработало.
Завтра погоняю на макете, отпишусь
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
21.11.2013, 06:35
Цитата Сообщение от Alex5 Посмотреть сообщение
char buff [100002];
??

Memory-mapped file
0
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 23
29.11.2013, 00:31  [ТС]
Проверил на макете. Вроде все работает.
Alex5, еще раз спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.11.2013, 00:31
Помогаю со студенческими работами здесь

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

Чтение из файла в строку (в MFC)
Всем привет! Есть две строки, в которые вводятся значения (два числа которые надо сложить) и текстовый документ, в котором эти значения...

MFC Чтение из файла в Lst Box
Доброе время суток. Мне нужно записать содержимое файла в List Box. Подскажите как. Спасибо. Добавлено через 1 час 19 минут Ну...

Чтение из файла и создание объектов MFC
Rect MyRect; CPaintDC dc(this); char buff; int x1,x2,x3,x4,i=1; ifstream f("E\\data.txt"); while(!f.eof()) { f>>buff;...

Чтение бинарного файла в строку: читается только один байт
Читаю бинарный файл в строку, но почему-то читает только 1 байт. Где здесь может быть ошибка? //ЧТЕНИЕ БИНАРНОГО ФАЙЛА В СТРОКУ FILE *f...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru