Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 97, средняя оценка - 4.75
vander
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
15.09.2008, 17:53     Чтение бинарных файлов #1
Здравствуйте уважаемые эксперты,хотелось бы узнать как можно прочитать шестнадцатиричные значения из файла,длиной 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);
}
Да согласен что в примере структурами и не пахнет, но все же надо бы с ними.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
qwone
8 / 8 / 1
Регистрация: 18.08.2008
Сообщений: 129
23.09.2008, 23:38     Чтение бинарных файлов #21
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();
        }
};
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vander
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
26.09.2008, 10:15  [ТС]     Чтение бинарных файлов #22
А что означает функция GetI
где ее описания?
qwone
8 / 8 / 1
Регистрация: 18.08.2008
Сообщений: 129
26.09.2008, 17:28     Чтение бинарных файлов #23
извени не полностью вставил описание класса . машинально и не проверил что получилось . описание в классе.
vander
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
26.09.2008, 19:15  [ТС]     Чтение бинарных файлов #24
А зачем функция void SetI иvoid SetLen если ты их не где не вызываеш?
Спасибо конечно что ты мне помогаеш, но нельзя с коментариями написать, плиз.

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

Код
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;};
// записать в памяти

unsigned int - это всего только адрес в полученном файле .
1 и 2й байт - I=0
3 и 4й байт - I=1 и так далее .
Ладно учись дальше . Сам потом до этого дойдешь.
vander
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
29.09.2008, 11:30  [ТС]     Чтение бинарных файлов #26
Я так и делал, но код непонятно что выводит,я и хотел чтобы ты коменты поставил,чтобы самому разобраться.
qwone
8 / 8 / 1
Регистрация: 18.08.2008
Сообщений: 129
29.09.2008, 17:43     Чтение бинарных файлов #27
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;
В этом месте ты смотришь начало файла , здесь ты можешь менять их .
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2008, 18:13     Чтение бинарных файлов
Еще ссылки по теме:

Запись и чтение бинарных файлов. Программа крашится при закрытии консольного окна C++
C++ Почему так(комбинации бинарных и не бинарных вводов и выводов)?
C++ О кодировке бинарных файлов
C++ Чтение бинарных файлов по байтам
C++ Чтение бинарных данных из файла

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

Или воспользуйтесь поиском по форуму:
vander
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
29.09.2008, 18:13  [ТС]     Чтение бинарных файлов #28
Ты наверно меня не так понял, потому что твой код выдает совсем не то что надо.
Спасибо за помощь.Тема закрыта.
Yandex
Объявления
29.09.2008, 18:13     Чтение бинарных файлов
Ответ Создать тему
Опции темы

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