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

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

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

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

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

Чтение бинарных файлов - 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++
открываю в hex-редакторе бинарный файл, там написано 41 54 26 54 вопрос как мне это записать в файл, чтобы этот файл можно было...

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

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

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

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

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

Добавлено через 1 минуту 30 секунд
п.п.с я через пару дней выложу сюда код загрузки битмапы,без сторонних библиотек. Для доведения темы до логического конца)
1
vander
0 / 0 / 0
Регистрация: 15.09.2008
Сообщений: 26
15.09.2008, 23:08  [ТС] #15
Ну воощет мне нужно было просто тело прочитать без BITMAPFILEHEADER и
BITMAPINFOHEADER.Записывать bmp без них научился эт как ты сказал
буквально щелчком пальца, а здесь мне к каждому пикселу отдельный подход нужен.
Спаибки большое за помощь.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2008, 23:08
Привет! Вот еще темы с ответами:

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

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

Объединение двух бинарных файлов - C++
Как сделать программу которая считывает числа (упорядоченные по возрастанию) из двух бинарных файлов f и g, и сливает их в один...

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


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
15.09.2008, 23:08
Ответ Создать тему
Опции темы

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