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

Чтение бинарных файлов

15.09.2008, 17:53. Показов 13878. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые эксперты,хотелось бы узнать как можно прочитать шестнадцатиричные значения из файла,длиной 1б,в блок размером 4байта каждый.
И запихнуть каждыйблок в структуру для того чтоб обратиться к каждому значению отдельно.

Проблемка у меня в том что байты в начале могут быть нулевыми,т.е.функции fread,fgets просто нечитают остальные, а со scanf я ужу мозги скрутил,не могу разобраться.
Спасибо.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream.h>
#include <stdio.h>
 
void main( void ) 
{
FILE *file;
char* file_name = "VMRImage5.bmp";
 
char load_string[1658934] ;
 
file = fopen( file_name, "rb" ); 
//fread(load_string, 4, 1, file);
fgets( load_string, 4 , file ); 
 
cout << "load_string = " << load_string << endl;
 
fclose(file);
}
Да согласен что в примере структурами и не пахнет, но все же надо бы с ними.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.09.2008, 17:53
Ответы с готовыми решениями:

Чтение бинарных файлов
посчитать количество байт между первым 0A и FF?

Чтение бинарных файлов
Как прочитать бинарный файл начиная с пятого байта до конца? и как потом это прочитанное записать в другой файл?

Чтение бинарных файлов
Не понимаю в чем ошибка. Задача: записать и вывести массивы ФИО и видов спорта, записанных в бинарные файлы. Выводит на консоль не...

27
10 / 10 / 2
Регистрация: 18.08.2008
Сообщений: 127
23.09.2008, 23:38
Студворк — интернет-сервис помощи студентам
vander прикол в том что надо создать класс и выделить участок динамической памяти .
А потом к нему обращаться , как массиву . я думаю лучше unsigned short - 2 байта .
Но вот я не знаю как найти длину файла . В своем я сразу длину а там все просто .
ладно смотри .
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// main.cpp
#include <iostream>
#include <fstream>
using namespace std;
#include "data.h"
 
int const Dlina_File =766/2; // здесь поставишь длину файла деленую на 2
 
int main(){
    char *p="icon1.ico";  // имя файла для считывания 
    char *p2="icon2.ico"; // имя файла для записи
    Data A(Dlina_File);
    load(p,A);
    save(p2,A);
    for (int i=0;i<10;i++)
        cout<<i<<"\t"<<(int)A.GetI(i)/256<<"\t"<<A.GetI(i)%256 <<endl;
        // а здесь побайтовый вывод .
    return 0;
}
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//data.h
class Data {
private:
    unsigned short *Data_p;
    unsigned int Len;
public:
    Data ();
    Data (unsigned short);
    ~Data ();
    friend void save(char *NameFile,Data & AA); // записать файл с диска в память
    friend void load(char *NameFile,Data & AA);// считать файл с диска в память
    void SetLen(unsigned short len);   // установить длину рабочего места в памяти
    unsigned short GetI(unsigned int I){return Data_p[i];}; // получить слово(2байта) из памяти
    void SetI(unsigned int I,unsigned short D){Data_p[i]=D;};// записать в память
};// ---- конец описания
Data::Data(){
    Len=0;
    Data_p=0;
}
Data::Data(unsigned short len){
    Len=len;Data_p=new unsigned short[Len];
}
void Data::SetLen(unsigned short len){
    delete[]Data_p;
    Len=len;Data_p=new unsigned short[Len];
    }    
Data::~Data(){
    delete[]Data_p;
    }
void save(char *NameFile,Data & AA){
    ofstream out(NameFile,ios::out |ios::binary);
    if(!out)
        cout <<"files don't open "<<endl;
    else{
        out.write((char*)AA.Data_p,(sizeof(unsigned short)*AA.Len));
        out.close();
        }
};
 
void load(char *NameFile,Data & AA){
    ifstream in(NameFile,ios::in |ios::binary);
    if(!in)
        cout <<"files don't open "<<endl;
    else {
        in.read((char*)AA.Data_p,(sizeof(unsigned short)*AA.Len));
        cout<<"READ OK" <<endl;
        in.close();
        }
};
0
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
26.09.2008, 10:15  [ТС]
А что означает функция GetI
где ее описания?
0
10 / 10 / 2
Регистрация: 18.08.2008
Сообщений: 127
26.09.2008, 17:28
извени не полностью вставил описание класса . машинально и не проверил что получилось . описание в классе.
0
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
26.09.2008, 19:15  [ТС]
А зачем функция void SetI иvoid SetLen если ты их не где не вызываеш?
Спасибо конечно что ты мне помогаеш, но нельзя с коментариями написать, плиз.

А воощет я разобрался со своим кодом , там не unsigned int делать надо а unsigned char при выделении памяти
Всем огромное спасибо.
:-)
0
10 / 10 / 2
Регистрация: 18.08.2008
Сообщений: 127
27.09.2008, 21:12
хотя этот класс предназначен для записи и считывания из файла . Только он сделан так что бы можно было работать с некоторым массивом- памятью . Какие еще комментарии ставить . там все очень примитивно . Ты ж когда ходишь не ставишь комментарии на ноги . А, я понял . Ты что думаешь , если посмотришь на код все станет понятно . Это заблуждение . Для того что бы понять как работает код ,надо его запустить , а затем остечь разные части и запустить снова.

Code
1
friend void save(char *NameFile,Data & AA);
// записать файл с диска в память
Code
1
    friend void load(char *NameFile,Data & AA);
// считать файл с диска в память
Code
1
    void SetLen(unsigned short len);
// установить длину рабочего места в памяти
Code
1
   unsigned short GetI(unsigned int I){return Data_p[i];}
; // получить слово(2байта) из памяти
Code
1
  void SetI(unsigned int I,unsigned short D){Data_p[i]=D;};
// записать в памяти

unsigned int - это всего только адрес в полученном файле .
1 и 2й байт - I=0
3 и 4й байт - I=1 и так далее .
Ладно учись дальше . Сам потом до этого дойдешь.
0
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
29.09.2008, 11:30  [ТС]
Я так и делал, но код непонятно что выводит,я и хотел чтобы ты коменты поставил,чтобы самому разобраться.
0
10 / 10 / 2
Регистрация: 18.08.2008
Сообщений: 127
29.09.2008, 17:43
1) открываешь компилятор с IDE(у меня визуал студио) и ставишь для програм в консольном режиме .
2) добавляешь файл main.cpp и копируешь туда это
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// main.cpp
#include <iostream>
#include <fstream>
using namespace std;
#include "data.h"
 
int const Dlina_File =766/2; // здесь поставишь длину файла деленую на 2
 
int main(){
    char *p="icon1.ico";  // имя файла для считывания 
    char *p2="icon2.ico"; // имя файла для записи
    Data A(Dlina_File);
    load(p,A);
    save(p2,A);
    for (int i=0;i<10;i++)
        cout<<i<<"\t"<<(int)A.GetI(i)/256<<"\t"<<A.GetI(i)%256 <<endl;
        // а здесь побайтовый вывод .
    return 0;
}
3) создаешь файл data.h и копируешь это
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//data.h
class Data {
private:
    unsigned short *Data_p;
    unsigned int Len;
public:
    Data ();
    Data (unsigned short);
    ~Data ();
    friend void save(char *NameFile,Data & AA); // записать файл с диска в память
    friend void load(char *NameFile,Data & AA);// считать файл с диска в память
    void SetLen(unsigned short len);   // установить длину рабочего места в памяти
    unsigned short GetI(unsigned int I){return Data_p[I];}; // получить слово(2байта) из памяти
    void SetI(unsigned int I,unsigned short D){Data_p[I]=D;};// записать в память
};// ---- конец описания
Data::Data(){
    Len=0;
    Data_p=0;
}
Data::Data(unsigned short len){
    Len=len;Data_p=new unsigned short[Len];
}
void Data::SetLen(unsigned short len){
    delete[]Data_p;
    Len=len;Data_p=new unsigned short[Len];
    }    
Data::~Data(){
    delete[]Data_p;
    }
void save(char *NameFile,Data & AA){
    ofstream out(NameFile,ios::out |ios::binary);
    if(!out)
        cout <<"files don't open "<<endl;
    else{
        out.write((char*)AA.Data_p,(sizeof(unsigned short)*AA.Len));
        out.close();
        }
};
 
void load(char *NameFile,Data & AA){
    ifstream in(NameFile,ios::in |ios::binary);
    if(!in)
        cout <<"files don't open "<<endl;
    else {
        in.read((char*)AA.Data_p,(sizeof(unsigned short)*AA.Len));
        cout<<"READ OK" <<endl;
        in.close();
        }
};
4) находишь какойто бинарный файл . я взял иконку icon1.ico. но ты можешь взять любой и кидаешь туда где будет создаваться .ехе файл . потом меняешь название в программе с icon1.ico. на то что там будет .A icon2.ico на то что ты хочешь получить.
Затем в проводнике Windows находишь размер файла который у тебя будет вместо
icon1.ico. и смотришь свойства файла .там есть размер .
меняешь в main.cpp 766 на этот размер
int const Dlina_File =766/2;
Запускаешь и смотришь . Если образовался файл который ты заменил с icon2.ico .
то считывание и запись прошли успешно
C++
1
2
for (int i=0;i<10;i++)
        cout<<i<<"\t"<<(int)A.GetI(i)/256<<"\t"<<A.GetI(i)%256 <<endl;
В этом месте ты смотришь начало файла , здесь ты можешь менять их .
0
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
29.09.2008, 18:13  [ТС]
Ты наверно меня не так понял, потому что твой код выдает совсем не то что надо.
Спасибо за помощь.Тема закрыта.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.09.2008, 18:13

Чтение бинарных файлов по байтам
Есть бинарный файл, который состоит из большого числа разновидной информации записанной в hex-е. Как можно считывать этот файл и...

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

Запись и чтение бинарных файлов. Программа крашится при закрытии консольного окна
Имеется задачка: Написать программу которая будет записывать бинарные данные в файл, а так-же строковые данные типа std::string,...

Чтение бинарных данных из файла
# include &lt;iostream&gt; # include &lt;vector&gt; # include &lt;fstream&gt; using namespace std; int main () {

Чтение бинарных данных формата dat
]Помогите прочитать данные с бинарного файла формата dat. Данный файл принадлежит навигационной карте


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru