Форум программистов, компьютерный форум 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);
}
Да согласен что в примере структурами и не пахнет, но все же надо бы с ними.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
XuTPbIu_MuHTAu
Эксперт C++
 Аватар для XuTPbIu_MuHTAu
2219 / 734 / 10
Регистрация: 27.05.2008
Сообщений: 1,507
15.09.2008, 18:24     Чтение бинарных файлов #2
попробуй с помощью fread
vander
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
15.09.2008, 18:42  [ТС]     Чтение бинарных файлов #3
Цитата Сообщение от XuTPbIu_MuHTAu Посмотреть сообщение
попробуй с помощью fread
Мужик ты не внимателен,
Проблемка у меня в том что байты в начале могут быть нулевыми,т.е.функции fread,fgets просто нечитают остальные.
XuTPbIu_MuHTAu
Эксперт C++
 Аватар для XuTPbIu_MuHTAu
2219 / 734 / 10
Регистрация: 27.05.2008
Сообщений: 1,507
15.09.2008, 18:48     Чтение бинарных файлов #4
Цитата Сообщение от vander Посмотреть сообщение
Мужик ты не внимателен,
Проблемка у меня в том что байты в начале могут быть нулевыми,т.е.функции fread,fgets просто нечитают остальные.
Тут все проще.Ты выводишь прочтенные байты через cout,
а у него нулевой байт - конец строки. Так что читаться-то они читаются,но в консоли ты их не увидишь
vander
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
15.09.2008, 19:00  [ТС]     Чтение бинарных файлов #5
Цитата Сообщение от XuTPbIu_MuHTAu Посмотреть сообщение
Тут все проще.Ты выводишь прочтенные байты через cout,
а у него нулевой байт - конец строки. Так что читаться-то они читаются,но в консоли ты их не увидишь
спасибки.
А что нибудь посоветуеш для вывода?
XuTPbIu_MuHTAu
Эксперт C++
 Аватар для XuTPbIu_MuHTAu
2219 / 734 / 10
Регистрация: 27.05.2008
Сообщений: 1,507
15.09.2008, 19:03     Чтение бинарных файлов #6
ага. Проще всего - форматированый вывод,побайтно :
Код
//....здесь цикл
printf("%d ",(int) load_string[i] );
//
Будет значение 0 - 255 для каждого байта через пробел.
vander
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
15.09.2008, 19:09  [ТС]     Чтение бинарных файлов #7
ага. Проще всего - форматированый вывод,побайтно :
Код
//....здесь цикл
printf("%d ",(int) load_string[i] );
//
Будет значение 0 - 255 для каждого байта через пробел.
Вот что получилось
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream.h>
#include <stdio.h>
 
void main( void ) 
{
FILE *file;
char* file_name = "VMRImage5.bmp";
 
char load_string[1658881] ;
long i;
 
file = fopen( file_name, "rb" ); 
//41470
for (int qw =0;qw<1658880;qw++)
{
 
fgets( load_string, 4 , file ); 
 
printf("%d ",(int) load_string[qw] );
}
fclose(file);
}
но вылетает.
XuTPbIu_MuHTAu
Эксперт C++
 Аватар для XuTPbIu_MuHTAu
2219 / 734 / 10
Регистрация: 27.05.2008
Сообщений: 1,507
15.09.2008, 19:14     Чтение бинарных файлов #8
вылетает с надписью "stack overflow"?

Добавлено через 2 минуты 2 секунды
В любом случае,код неверен. Ты в цикле много раз читаешь из файла четыре байта,записываешь в начало load_string, потом выводишь один байт из совсем другой части load_string(кроме первых итераций)....
vander
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
15.09.2008, 19:26  [ТС]     Чтение бинарных файлов #9
Цитата Сообщение от XuTPbIu_MuHTAu Посмотреть сообщение
вылетает с надписью "stack overflow"?

Добавлено через 2 минуты 2 секунды
В любом случае,код неверен. Ты в цикле много раз читаешь из файла четыре байта,записываешь в начало load_string, потом выводишь один байт из совсем другой части load_string(кроме первых итераций)....
Та не вроде ,просто отчет об ошибке и все.
и к стати
Цитата Сообщение от XuTPbIu_MuHTAu Посмотреть сообщение
Будет значение 0 - 255 для каждого байта через пробел.
эт то что нужно.
и если fgets( load_string[n], 4 , file );
то кричит
error C2664: 'fgets' : cannot convert parameter 1 from 'char' to 'char *'
може как нить сконвертить мона
XuTPbIu_MuHTAu
Эксперт C++
 Аватар для XuTPbIu_MuHTAu
2219 / 734 / 10
Регистрация: 27.05.2008
Сообщений: 1,507
15.09.2008, 19:32     Чтение бинарных файлов #10
нужно &load_string[n], функции передается не символ,а адрес,куда записать прочитанные байты.Кстати,почему четыре?
vander
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
15.09.2008, 19:44  [ТС]     Чтение бинарных файлов #11
нужно &load_string[n], функции передается не символ,а адрес,куда записать прочитанные байты.Кстати,почему четыре?
мне цвета нужны.
Ну вот что получилось
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream.h>
#include <stdio.h>
 
void main( void ) 
{
FILE *file;
char* file_name = "VMRImage5.bmp";
 
char load_string[1658881] ;
 
 
file = fopen( file_name, "rb" ); 
//41470
for (int qw =0;qw<1658881;qw++)
{
int n=0;    
fgets( &load_string[n+1], 1 , file ); 
 
 
printf("%d ",(int) load_string[n] );
}
fclose(file);
}
но не хочет
Spo1ler
 Аватар для Spo1ler
291 / 51 / 3
Регистрация: 22.05.2008
Сообщений: 788
15.09.2008, 21:46     Чтение бинарных файлов #12
а еще есть такое,только надо инклюдить fstream.h

fstream f123(filename, ios::binary | ios::read | ios::write );

если я не ошибаюсь
vander
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
15.09.2008, 21:49  [ТС]     Чтение бинарных файлов #13
Проблема оказалась в длине char load_string[1658881] ;, хотя это есть размер файла +1 под нулевой символ.
если ставлю
char load_string[165888] ;
то все работает нормально. спасибо
,но теперь вопрос как увеличить обьем char load_string;
XuTPbIu_MuHTAu
Эксперт C++
 Аватар для XuTPbIu_MuHTAu
2219 / 734 / 10
Регистрация: 27.05.2008
Сообщений: 1,507
15.09.2008, 21:56     Чтение бинарных файлов #14
в том то и дело,что должен был выдавать стек оверфлоу,но не выдавал(я у тя спрашивал). Локальные переменные функций сохраняются в стеке,а он не очень то резиновый. Используй динамическую память - выделишь память из кучи,и все окей.
char * load_string = new char[size]
п.с используй символьные константы,вместо того,чтобы писать это длинное число каждый раз

Добавлено через 3 минуты 3 секунды
Да,и мне не хотелось прерывать такой полезный творческий процесс,но битмапы винда загружает буквально щелчком пальца )

Добавлено через 1 минуту 30 секунд
п.п.с я через пару дней выложу сюда код загрузки битмапы,без сторонних библиотек. Для доведения темы до логического конца)
vander
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
15.09.2008, 23:08  [ТС]     Чтение бинарных файлов #15
Ну воощет мне нужно было просто тело прочитать без BITMAPFILEHEADER и
BITMAPINFOHEADER.Записывать bmp без них научился эт как ты сказал
буквально щелчком пальца, а здесь мне к каждому пикселу отдельный подход нужен.
Спаибки большое за помощь.
XuTPbIu_MuHTAu
Эксперт C++
 Аватар для XuTPbIu_MuHTAu
2219 / 734 / 10
Регистрация: 27.05.2008
Сообщений: 1,507
15.09.2008, 23:34     Чтение бинарных файлов #16
vander,знаешь,в чем бонус хедеров? тебе не придется перекомпилировать программу для битмапов разного размера
vander
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
21.09.2008, 09:29  [ТС]     Чтение бинарных файлов #17
Возникла проблема, при преобразовании в int
printf("%d ",(int) load_string[n] );
преобразует A9 в -87 а не в 169
Кто чо знает подскажите плиз
qwone
8 / 8 / 1
Регистрация: 18.08.2008
Сообщений: 129
21.09.2008, 12:47     Чтение бинарных файлов #18
vander если ты не нашел нормальный ответ на чтение бинарных файлов то скорее всего просто не с той стороны зашел . а может я нашел другой вариант .
итак
там мне надо бы сохранить объект и считать снова .
в общем смотри по ссылке .http://forum.sources.ru/index.php?showtopic=250486&st=0&#14
там 14 сообщение френд фунции класса save() и load()

если ты найдешь что-то полезное спроси здесь
printf("%d ",(int) load_string[n] );
а
printf("%d ",(unsigned int) load_string[n] ); не пробовал?
vander
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
21.09.2008, 20:54  [ТС]     Чтение бинарных файлов #19
Цитата Сообщение от qwone Посмотреть сообщение
vander если ты не нашел нормальный ответ на чтение бинарных файлов то скорее всего просто не с той стороны зашел . а может я нашел другой вариант .
итак
там мне надо бы сохранить объект и считать снова .
в общем смотри по ссылке .http://forum.sources.ru/index.php?showtopic=250486&st=0
там 14 сообщение френд фунции класса save() и load()

если ты найдешь что-то полезное спроси здесь

а
printf("%d ",(unsigned int) load_string[n] ); не пробовал?
Как не странно пробовал но нефига:-(.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.09.2008, 11:08     Чтение бинарных файлов
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
vander
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
23.09.2008, 11:08  [ТС]     Чтение бинарных файлов #20
qwone, А Ты не мог коментариии сделать хотябы на эти функции,плиз.
Yandex
Объявления
23.09.2008, 11:08     Чтение бинарных файлов
Ответ Создать тему
Опции темы

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