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

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте уважаемые эксперты,хотелось бы узнать как можно прочитать шестнадцатиричные значения из файла,длиной 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.09.2008, 17:53
Ответы с готовыми решениями:

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

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

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

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

27
Эксперт С++
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
15.09.2008, 18:24 2
попробуй с помощью fread
0
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
15.09.2008, 18:42  [ТС] 3
Цитата Сообщение от XuTPbIu_MuHTAu Посмотреть сообщение
попробуй с помощью fread
Мужик ты не внимателен,
Проблемка у меня в том что байты в начале могут быть нулевыми,т.е.функции fread,fgets просто нечитают остальные.
0
Эксперт С++
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
15.09.2008, 18:48 4
Цитата Сообщение от vander Посмотреть сообщение
Мужик ты не внимателен,
Проблемка у меня в том что байты в начале могут быть нулевыми,т.е.функции fread,fgets просто нечитают остальные.
Тут все проще.Ты выводишь прочтенные байты через cout,
а у него нулевой байт - конец строки. Так что читаться-то они читаются,но в консоли ты их не увидишь
0
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
15.09.2008, 19:00  [ТС] 5
Цитата Сообщение от XuTPbIu_MuHTAu Посмотреть сообщение
Тут все проще.Ты выводишь прочтенные байты через cout,
а у него нулевой байт - конец строки. Так что читаться-то они читаются,но в консоли ты их не увидишь
спасибки.
А что нибудь посоветуеш для вывода?
0
Эксперт С++
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
15.09.2008, 19:03 6
ага. Проще всего - форматированый вывод,побайтно :
Код
//....здесь цикл
printf("%d ",(int) load_string[i] );
//
Будет значение 0 - 255 для каждого байта через пробел.
1
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);
}
но вылетает.
0
Эксперт С++
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
15.09.2008, 19:14 8
вылетает с надписью "stack overflow"?

Добавлено через 2 минуты 2 секунды
В любом случае,код неверен. Ты в цикле много раз читаешь из файла четыре байта,записываешь в начало load_string, потом выводишь один байт из совсем другой части load_string(кроме первых итераций)....
0
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 *'
може как нить сконвертить мона
0
Эксперт С++
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
15.09.2008, 19:32 10
нужно &load_string[n], функции передается не символ,а адрес,куда записать прочитанные байты.Кстати,почему четыре?
0
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);
}
но не хочет
0
296 / 56 / 5
Регистрация: 22.05.2008
Сообщений: 788
15.09.2008, 21:46 12
а еще есть такое,только надо инклюдить fstream.h

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

если я не ошибаюсь
0
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;
0
Эксперт С++
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
15.09.2008, 21:56 14
в том то и дело,что должен был выдавать стек оверфлоу,но не выдавал(я у тя спрашивал). Локальные переменные функций сохраняются в стеке,а он не очень то резиновый. Используй динамическую память - выделишь память из кучи,и все окей.
char * load_string = new char[size]
п.с используй символьные константы,вместо того,чтобы писать это длинное число каждый раз

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

Добавлено через 1 минуту 30 секунд
п.п.с я через пару дней выложу сюда код загрузки битмапы,без сторонних библиотек. Для доведения темы до логического конца)
1
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
15.09.2008, 23:08  [ТС] 15
Ну воощет мне нужно было просто тело прочитать без BITMAPFILEHEADER и
BITMAPINFOHEADER.Записывать bmp без них научился эт как ты сказал
буквально щелчком пальца, а здесь мне к каждому пикселу отдельный подход нужен.
Спаибки большое за помощь.
0
Эксперт С++
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
15.09.2008, 23:34 16
vander,знаешь,в чем бонус хедеров? тебе не придется перекомпилировать программу для битмапов разного размера
0
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
21.09.2008, 09:29  [ТС] 17
Возникла проблема, при преобразовании в int
printf("%d ",(int) load_string[n] );
преобразует A9 в -87 а не в 169
Кто чо знает подскажите плиз
0
10 / 10 / 2
Регистрация: 18.08.2008
Сообщений: 127
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] ); не пробовал?
0
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] ); не пробовал?
Как не странно пробовал но нефига:-(.
0
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
23.09.2008, 11:08  [ТС] 20
qwone, А Ты не мог коментариии сделать хотябы на эти функции,плиз.
0
23.09.2008, 11:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.09.2008, 11:08
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru