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

Ваш аккаунт

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

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

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

Как правильно читать символы из бинарного файла?

2.0K
17 июня 2015 года
oleg_159
77 / / 13.04.2008
Я хочу прочитать hex-символы бинарного файла. Делаю так
Код:
std::ifstream is("333", std::ifstream::binary);
if(is)
  {
  is.seekg (0, is.end);
  int length = is.tellg();
  is.seekg (0, is.beg);
  char * buffer = new char [length];
  is.read (buffer,length);
  is.close();
  std::cout<<hex<<(unsigned int)buffer[0]<<endl;
  std::cout<<(unsigned int)buffer[1]<<endl;
  std::cout<<(unsigned int)buffer[2]<<endl;
  std::cout<<(unsigned int)buffer[3]<<endl;
  std::cout<<(unsigned int)buffer[4]<<endl;
  std::cout<<(unsigned int)buffer[5]<<endl;
  delete[] buffer;
  }
Почему на выводе не:
FF
D8
FF
E0
00
10
а удлинённые:
FFFFFFFF
FFFFFFD8
FFFFFFFF
FFFFFFE0
0
76
1
17 июня 2015 года
kot_
7.3K / / 20.01.2000
maybe
 
Код:
std::cout<<hex<<setw(2)<<(unsigned int)buffer[0]<<endl;
260
17 июня 2015 года
Ramon
1.1K / / 16.08.2003
Дети, не играйте с приведениями типов.
2.0K
18 июня 2015 года
oleg_159
77 / / 13.04.2008
Цитата: kot_
maybe
 
Код:
std::cout<<hex<<setw(2)<<(unsigned int)buffer[0]<<endl;

Всё осталось без изменений.

2.0K
18 июня 2015 года
oleg_159
77 / / 13.04.2008
Цитата: Ramon
Дети, не играйте с приведениями типов.

Во-первых, не дети, а любители, а во-вторых, если знаете, подскажите.

1
18 июня 2015 года
kot_
7.3K / / 20.01.2000
Цитата: oleg_159
Цитата: Ramon
Дети, не играйте с приведениями типов.

Во-первых, не дети, а любители, а во-вторых, если знаете, подскажите.

он имеет ввиду что при подобных манипуляциях можно легко получить неожиданное поведение программы.
Что содержится в файле? Что читается в переменную? Какой размер length?
У меня подобная ситуация не воспроизводится - при условии конечно если в buffer читается D8 а не FFFFFFD8 например.

7
19 июня 2015 года
@pixo $oft
3.4K / / 20.09.2006
Ясен перец, ты ж 1-байтовый тип к 4-байтовому приводишь! Чего ты ещё хотел?
Пользуйся форматированным выводом.
2.0K
22 июня 2015 года
oleg_159
77 / / 13.04.2008
Цитата: kot_
Цитата: oleg_159
Цитата: Ramon
Дети, не играйте с приведениями типов.

Во-первых, не дети, а любители, а во-вторых, если знаете, подскажите.

он имеет ввиду что при подобных манипуляциях можно легко получить неожиданное поведение программы.
Что содержится в файле? Что читается в переменную? Какой размер length?
У меня подобная ситуация не воспроизводится - при условии конечно если в buffer читается D8 а не FFFFFFD8 например.

Короче, у меня много файлов без расширения, среди них хочу найти графические *.jpg
Я нашёл в инете кусок программы, с помощью которой всё получилось. Вот её кусок:

Код:
//ОТКРЫВАЕТ ФАЙЛ
from=fopen(file,"rb");//открывает файл для чтения как двоичный
if(from==NULL)
  {
  fputs("File error",stderr);//это можно не писать
  return;
  }

//ВЫДЕЛЯЕТ ПАМЯТЬ ДЛЯ КОПИРОВАНИЯ В НЕЁ СЧИТАННОЙ ИНФОРМАЦИИ
s=(char*)malloc(sizeof(char)*n_read);
if(s==NULL)
  {
  fputs("Memory error",stderr);//это можно не писать
  return;
  }

fread(s,1,n_read,from);//читает n_read-байт файла в 's'
//??? Вот только непонятно здесь, почему в fread(,1,,) стоит единица, а не ноль ???

//ПОИСК РАСШИРЕНИЯ ФАЙЛА
//.jpg
if(s[0]=='xFF' && s[1]=='xD8' && s[2]=='xFF')//если формат jpg
  {
  key=true;//расширение найдено
  strcpy(ras,".jpg");//расширение для файла
  }
392
24 июня 2015 года
cronya
421 / / 03.01.2009
Цитата:
fread(s,1,n_read,from);//читает n_read-байт файла в 's'
//??? Вот только непонятно здесь, почему в fread(,1,,) стоит единица, а не ноль ???

видимо программисты настолько суровые нынче пошли, что в библиотеки не заглядывают вовсе

Код:
size_t fread( void * ptrvoid, size_t size, size_t count, FILE * filestream );

Описание
Функция fread считывает массив размером — count элементов, каждый из которых имеет размер size байт, из потока, и сохраняет его в блоке памяти, на который указывает ptrvoid.
Индикатор положения потока увеличивается на общее число записанных байтов.
Общее количество успешно считанных байт (count*).
Параметры:

    ptrvoid
    Указатель на блок памяти, размер которого должен быть минимум  (size*count) байт.
    size
    Размер в байтах каждого считываемого элемента.
    count
    Количество элементов, каждый из которых имеет размер size байт.
    filestream
    Указатель на объект типа FILE, который связан с потоком ввода.

Возвращаемое значение

Возвращается объект типа size_t, который содержит общее количество, успешно считанных, элементов.
Если возвращаемое значение отличается от количества элементов, значит произошла ошибка или  был достигнут конец файла.
Вы можете использовать функции ferror или feof для определения проблемы — произошла ошибка или был достигнут конец файла.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог