Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

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

16K
15 сентября 2008 года
vander1
23 / / 20.08.2006
Здравствуйте уважаемые эксперты,хотелось бы узнать как можно прочитать шестнадцатиричные значения из файла,длиной 1б,в блок размером 4байта каждый.
И запихнуть каждыйблок в структуру для того чтоб обратиться к каждому значению отдельно.

Проблемка у меня в том что байты в начале могут быть нулевыми,т.е.функции fread,fgets просто нечитают остальные, а со scanf я ужу мозги скрутил,не могу разобраться.
Спасибо.

Код:
#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);
}






Да согласен что в примере структурами и не пахнет, но все же надо бы с ними.
240
15 сентября 2008 года
aks
2.5K / / 14.07.2006
Исспользуй fread.
Правда зачем мешать С-ные функции и потоки C++?
16K
15 сентября 2008 года
vander1
23 / / 20.08.2006
Цитата: aks
Исспользуй fread.
Правда зачем мешать С-ные функции и потоки C++?


Так яж говорю
Проблемка у меня в том что байты в начале могут быть нулевыми,т.е.функции fread,fgets просто нечитают остальные.

12K
15 сентября 2008 года
__AleXX__
133 / / 02.04.2007
У тебя кажись не fread несчитывает, а cout не выводит :)
16K
15 сентября 2008 года
vander1
23 / / 20.08.2006
Цитата: __AleXX__
У тебя кажись не fread несчитывает, а cout не выводит :)


А чего сможеш посоветовать?

12K
15 сентября 2008 года
__AleXX__
133 / / 02.04.2007
Ты считываешь fread-ом бинарные данные -> выводить надо как бинарные;

например так:
Код:
void main( void )
{
FILE *file;
char* file_name = "VMRImage5.bmp";

int buf = 0;

file = fopen( file_name, "rb" );
fread(&buf, sizeof(buf), 1, file);

cout << "buf = " << buf << endl;

fclose(file);
}


Это примерчик для int.

Эсли что, спрашивай. Вечером отвечу.
16K
15 сентября 2008 года
vander1
23 / / 20.08.2006
Цитата: __AleXX__
Ты считываешь fread-ом бинарные данные -> выводить надо как бинарные;

например так:
Код:
void main( void )
{
FILE *file;
char* file_name = "VMRImage5.bmp";

int buf = 0;

file = fopen( file_name, "rb" );
fread(&buf, sizeof(buf), 1, file);

cout << "buf = " << buf << endl;

fclose(file);
}


Это примерчик для int.

Эсли что, спрашивай. Вечером отвечу.



не знаю причем здесь sizeof.
но выводит чтото типа 1108 хотя я надеялся на весь файл

288
15 сентября 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: vander1
Так яж говорю
Проблемка у меня в том что байты в начале могут быть нулевыми,т.е.функции fread,fgets просто нечитают остальные.



Функции fread абсолютно "по барабану" какие байты считывать, что нулевые, что ненулевые. Ну а оператор <<, перегруженный для char *, само собой будет выводить символы только до нулевого, т.к. считает, что это конец строки. Хотите выводить содержимое бинарного файла на экран, используйте printf с соотвествующей форматной строкой.

12K
16 сентября 2008 года
__AleXX__
133 / / 02.04.2007
А мозгами подумать?

Где в примере написано что считывается весь файл?

Весь файл надо считывать в цикле. функция feof() вроде должна вернуть true если пришел конец файла.

Какой смысл в том что я напишу тебе весь код? такого кода обычно хватает и в учебниках.
16K
16 сентября 2008 года
vander1
23 / / 20.08.2006
Да ты оказался прав,+ неправильное выделение памяти
16K
16 сентября 2008 года
vander1
23 / / 20.08.2006
Спасибо за помощ
12K
16 сентября 2008 года
__AleXX__
133 / / 02.04.2007
в принципе да:

char* file_name = "VMRImage5.bmp";

но хорошо, что сам до этого дошел :) так всегда интереснее
16K
16 сентября 2008 года
vander1
23 / / 20.08.2006
Кстати вот чо получилось



#include <iostream.h>
#include <stdio.h>
#include <fstream.h>



#define size 1658880

void main( void )
{
FILE *file;
char* file_name = "VMRImage5.bmp";
char * load_string = new char[size];



file = fopen( file_name, "rb" );
//41470
for (int qw =0;qw<1658880;qw++)
{
int n=0;

fread(load_string, 1, 1, file);


printf("%d ",(int) load_string[n] );


}
fclose(file);
}
ну еще в с труктуру запихнуть и все
16K
20 сентября 2008 года
vander1
23 / / 20.08.2006
Возникла проблема, при преобразовании в int
printf("%d ",(int) load_string[n] );
преобразует A9 в -87 а не в 169
Кто чо знает подскажите плиз
12K
21 сентября 2008 года
__AleXX__
133 / / 02.04.2007
попробуй приводить к unsigned int.

И вообще, зачем создавать такой массив char-ов, если используешь реально только первый его элемент?

Или это не весь код?
16K
21 сентября 2008 года
vander1
23 / / 20.08.2006
Цитата: __AleXX__
попробуй приводить к unsigned int.

И вообще, зачем создавать такой массив char-ов, если используешь реально только первый его элемент?

Или это не весь код?


Не, не прокатывает,как было так и осталось.:-(

12K
21 сентября 2008 года
__AleXX__
133 / / 02.04.2007
Цитата: vander1
Не, не прокатывает,как было так и осталось.:-(



Сорри, я тукан. Преобразование там вообще ни к чему. У тебя неправильная формат-строка, должно быть: "%u"

16K
21 сентября 2008 года
vander1
23 / / 20.08.2006
Неа, вооще там где минусы число десятизначное выдает.а точнее верхняя граница диапазона типа - (минус) тот бред о котором я говорил выше
16K
27 сентября 2008 года
vander1
23 / / 20.08.2006
А воощет я разобрался со своим кодом , там не unsigned int делать надо а unsigned char при выделении памяти .
Всем огромное спасибо.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог