C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Двоичный файл dat [РЕШЕНО]  (Прочитано 6841 раз)
Bugs
Участник


Сказали спасибо: +25/-20
Offline

Сообщений: 389


« : 16 Январь 2013, 16:39:55 »

Сдравствуйте господа программисты.

Сломал голову как мне из бинарного файла dat считать строку вида AnsiString

Алгоритм

1) Открыть файл для чтения
2) Читать файл по 32кб в бинарный массив , анализировать сохранять оттуда строчку AnsiString
3) Закрыть файл
4) Освободить память


Всё перемешалось в голове. из благодарности WebMoney, Незнаю куда рыть.  
« Последнее редактирование: 23 Январь 2013, 13:17:22 от Bugs » Записан
serg76
Участник


Сказали спасибо: +38/-2
Offline

Сообщений: 575


« Ответ #1 : 16 Январь 2013, 17:57:37 »

вытащить из структуры файла адресс начала строки и длину

Цитировать
сместиться както на номера битов
непонятно причем тут номера битов

Цитировать
tn:=buf_obr[nn].blk[28]+buf_obr[nn].blk[27]*128;
если есть рабочий код, поставить брэкпоинт и в пошаговом режиме разобрать загрузку файла
Записан
serg76
Участник


Сказали спасибо: +38/-2
Offline

Сообщений: 575


« Ответ #2 : 17 Январь 2013, 10:14:33 »

Цитировать
Байты 14-15 / биты с 6-го по 0-вой
если описание переменных секрет

Цитировать
биты с 6-го по 0-вой
по шесть бит в байте, до 63
мах 63 длина строки и в пределах 63 смещение от начала файла
Записан
Kray74
Посты на падонкаффском принципиально не читаю.
Участник


Сказали спасибо: +81/-1
Offline

Сообщений: 366


« Ответ #3 : 17 Январь 2013, 10:58:09 »

Bugs, объясни пожалуйста внятно, что тебе нужно?
Записан
Bugs
Участник


Сказали спасибо: +25/-20
Offline

Сообщений: 389


« Ответ #4 : 17 Январь 2013, 12:31:11 »

Bugs, объясни пожалуйста внятно, что тебе нужно?

Мне нужно

Алгоритм

1) Открыть файл для чтения
2) Читать файл по 32кб в бинарный массив , анализировать сохранять оттуда строчку AnsiString
3) Закрыть файл
4) Освободить память
« Последнее редактирование: 17 Январь 2013, 12:38:00 от Bugs » Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


« Ответ #5 : 17 Январь 2013, 13:14:48 »

Если знаешь структуру файла и знаешь где в нем начинается строка (а иначе как ещё?) и она заканчивается нулём, то что-то типа
Код
    char z[] = {"sample"};
String s;
s.cat_sprintf(z);
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


« Ответ #6 : 17 Январь 2013, 13:16:05 »

А сам файл хоть посредством TFileStream считывай в байтовый массив, внутри которого будет начало массива z == начало стринга
Записан
Bugs
Участник


Сказали спасибо: +25/-20
Offline

Сообщений: 389


« Ответ #7 : 17 Январь 2013, 15:30:14 »

А сам файл хоть посредством TFileStream считывай в байтовый массив, внутри которого будет начало массива z == начало стринга

Докапался до этого я наверно ошибаюсь 


void __fastcall TForm1::Button2Click(TObject *Sender)
{

// Структура данных //
String Humbers; // Искомые значения

char * buffer;
int length;
FILE *f;  //описываем файловую переменную

//Открываем файл на двоичное чтение
if( (f = fopen( "info.dat", "rb")) == NULL)
{
Memo1->Lines->Add("Файл не удалось открыть ");
return;
}

// выделяем память:
buffer = new char [length];

/*
fread(void *ptr, size, n, FILE *filename);
Функция fread считывает из файла filename в массив ptr n элементов размера size.
Функция возвращает количество считанных элементов.
После чтения из файла его указатель смещается на n*size байт. */

//tn:=buf_obr[nn].blk[28]+buf_obr[nn].blk[27]*128; пример delphi

fread(&buffer, sizeof(length), 1, f);

//Выводим информацию, например в компонент TMemo
//for(unsigned int i=0;i < (unsigned int)f->bsize/sizeof(int);i++)
Memo1->Lines->Add(Humbers);

//Закрываем файл
fclose(f);

//Освобождение памяти
delete[]buffer;

}
//---------------------------------------------------------------------------
Записан
serg76
Участник


Сказали спасибо: +38/-2
Offline

Сообщений: 575


« Ответ #8 : 17 Январь 2013, 17:43:19 »

в файле только строки или ещё какие данные?

чтение из бинарного файла
Код
#include
BYTE * buffer[32768];
char * str;
 
_fmode=O_BINARY;
if( (f = fopen( "info.dat", "rb")) == NULL)
{
Memo1->Lines->Add("Файл не удалось открыть ");
return;
}
 
fread(&buffer, 32768, 1, f);
 
str=(char *)(buffer+m);
 
fclose(f);
 
m- смещение
str - строка
Записан
Bugs
Участник


Сказали спасибо: +25/-20
Offline

Сообщений: 389


« Ответ #9 : 18 Январь 2013, 12:22:35 »

в файле только строки или ещё какие данные?

чтение из бинарного файла
Код
#include
BYTE * buffer[32768];
char * str;
 
_fmode=O_BINARY;
if( (f = fopen( "info.dat", "rb")) == NULL)
{
Memo1->Lines->Add("Файл не удалось открыть ");
return;
}
 
fread(&buffer, 32768, 1, f);
 
str=(char *)(buffer+m);
 
fclose(f);
 
m- смещение
str - строка

Неработает исключение лезит с ошибкой и всё

Да данные разные
Файлы разные по объёму, каждые 32 кб данные повторяються их нужно считывать  как-то.
« Последнее редактирование: 18 Январь 2013, 12:30:17 от Bugs » Записан
serg76
Участник


Сказали спасибо: +38/-2
Offline

Сообщений: 575


« Ответ #10 : 18 Январь 2013, 14:35:26 »

Цитировать
Да данные разные
Файлы разные по объёму, каждые 32 кб данные повторяються их нужно считывать  как-то.
не зная структуру блока 32кб, ничего не выйдет
Записан
Kray74
Посты на падонкаффском принципиально не читаю.
Участник


Сказали спасибо: +81/-1
Offline

Сообщений: 366


« Ответ #11 : 18 Январь 2013, 15:03:16 »

Измени код:
Код
BYTE buffer[32*1024];       // * перед buffer не нужна
 
fread(buffer, sizeof(BYTE), 32*1024, f); // & перед buffer не нужен
 
Записан
Bugs
Участник


Сказали спасибо: +25/-20
Offline

Сообщений: 389


« Ответ #12 : 23 Январь 2013, 13:16:51 »

BYTE buffer[32];
char * str;
FILE *f;  //описываем файловую переменную
AnsiString S = "";
int x;


_fmode=O_BINARY;
if( (f = fopen( "info.dat", "rb")) == NULL)
{
ShowMessage("Файл не открыть ");
return;
}

for( int i = 0; i < sizeof(buffer); i++ )
{
 /*

   and = и &&
   or = или ||

 */
fread(buffer, sizeof(BYTE), 32, f);

if( buffer[0]==6 || buffer[0]==7 )   // Только из 6 или 7 блоков данных

x=(buffer[4] << +buffer[5]; // Получение значения номера серии – 4 и 5-й байты буфера

FileList->Items->Add(S=IntToHex(x,4)+" "); // Перевод в строковый вид из 2-10 кода
}
S.TrimRight();

//delete buffer;
//Закрываем файл
fclose(f);
//освобождение памяти

Но кода я удаляю буффер вылезает ошибка ?? Ну вот так вообщем
Записан
Kray74
Посты на падонкаффском принципиально не читаю.
Участник


Сказали спасибо: +81/-1
Offline

Сообщений: 366


« Ответ #13 : 23 Январь 2013, 13:43:16 »

Цитировать
Но кода я удаляю буффер вылезает ошибка ??
Потому что ты не создавал его с помощью new, следовательно и delete не нужен.
Записан
Bugs
Участник


Сказали спасибо: +25/-20
Offline

Сообщений: 389


« Ответ #14 : 23 Январь 2013, 15:24:55 »

Цитировать
Но кода я удаляю буффер вылезает ошибка ??
Потому что ты не создавал его с помощью new, следовательно и delete не нужен.


ДА + Я забыл чему Архангельский учил...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.124 секунд. Запросов: 19.