Как правильно читать символы из бинарного файла?
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
Всё осталось без изменений.
Во-первых, не дети, а любители, а во-вторых, если знаете, подскажите.
Во-первых, не дети, а любители, а во-вторых, если знаете, подскажите.
он имеет ввиду что при подобных манипуляциях можно легко получить неожиданное поведение программы.
Что содержится в файле? Что читается в переменную? Какой размер length?
У меня подобная ситуация не воспроизводится - при условии конечно если в buffer читается D8 а не FFFFFFD8 например.
Пользуйся форматированным выводом.
Во-первых, не дети, а любители, а во-вторых, если знаете, подскажите.
он имеет ввиду что при подобных манипуляциях можно легко получить неожиданное поведение программы.
Что содержится в файле? Что читается в переменную? Какой размер 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");//расширение для файла
}
//??? Вот только непонятно здесь, почему в fread(,1,,) стоит единица, а не ноль ???
видимо программисты настолько суровые нынче пошли, что в библиотеки не заглядывают вовсе
Описание
Функция fread считывает массив размером — count элементов, каждый из которых имеет размер size байт, из потока, и сохраняет его в блоке памяти, на который указывает ptrvoid.
Индикатор положения потока увеличивается на общее число записанных байтов.
Общее количество успешно считанных байт (count*).
Параметры:
ptrvoid
Указатель на блок памяти, размер которого должен быть минимум (size*count) байт.
size
Размер в байтах каждого считываемого элемента.
count
Количество элементов, каждый из которых имеет размер size байт.
filestream
Указатель на объект типа FILE, который связан с потоком ввода.
Возвращаемое значение
Возвращается объект типа size_t, который содержит общее количество, успешно считанных, элементов.
Если возвращаемое значение отличается от количества элементов, значит произошла ошибка или был достигнут конец файла.
Вы можете использовать функции ferror или feof для определения проблемы — произошла ошибка или был достигнут конец файла.