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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 97, средняя оценка - 4.75
vander
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
#1

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

15.09.2008, 17:53. Просмотров 11728. Ответов 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);
}
Да согласен что в примере структурами и не пахнет, но все же надо бы с ними.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.09.2008, 17:53     Чтение бинарных файлов
Посмотрите здесь:

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

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

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

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

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

О кодировке бинарных файлов - C++
Здравствуйте;Тут такая проблема:Как заполнять бинарные файлы? Просто я если создаю обычный файл и пихаю туда обычные числа то он...

Запись бинарных файлов - C++
открываю в hex-редакторе бинарный файл, там написано 41 54 26 54 вопрос как мне это записать в файл, чтобы этот файл можно было...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
qwone
9 / 9 / 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
9 / 9 / 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
9 / 9 / 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
9 / 9 / 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++
Как сделать программу которая считывает числа (упорядоченные по возрастанию) из двух бинарных файлов f и g, и сливает их в один...

Счёт последовательностей бинарных файлов - C++
Написал программу, которая конвертирует текстовый файл в бинарный, считывает из него данные для структуры. И вроде всё работает. Но теперь...

Записать данные двух бинарных файлов в один - C++
Здравствуйте, столкнулся с проблемой. Нужно записать значения двух бинарных файлов в один, но при этом записанные значения не должны...

Из 2 заданых бинарных файлов вывести в 3 разность соответствующих чисел - C++
Имеются два бинарных файла содержащих числа. Создать третий файл каждый элемент, которого равен разнице между соответствующими элементами...

Почему так(комбинации бинарных и не бинарных вводов и выводов)? - C++
#include &lt;string&gt; #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;iomanip&gt; using namespace std; int main() { ...


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

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

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