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

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

17.11.2013, 01:16. Показов 2367. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru