Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > бинарные файлы


Автор: 344092 19.10.2007, 14:02
Доброго время суток. 

Есть непонятка с чтением и связью 2х файлов.

Есть 2 файла, в первом просто данные в бинарном виде
 а во втором наличее и длина блоков в первом файле.

Как можно прочесть эти файлы связав их вместе? В Delphi есть параметр

--AssignFile-- Связывает дескриптор файла с бинарным или текстовым файлом

что то такое :
assignFile(dat,с:/1.dat);
reset(dat,1);
        assignFile(spr,leftstr(edit1.Text,length(edit1.Text)-3)+'spr');

а в C++ Builder как сделать подобное????

Заранее Спасибо.




Автор: 0lmer 19.10.2007, 16:00
Цитата(344092 @  19.10.2007,  14:02 Найти цитируемый пост)
Есть 2 файла, в первом просто данные в бинарном виде а во втором наличее и длина блоков в первом файле.

А подробнее можно?


Цитата(344092 @  19.10.2007,  14:02 Найти цитируемый пост)
а в C++ Builder как сделать подобное????


Код

#include <stdio.h>
void main() {
  FILE * f1;
  f1 = fopen("Имя файла", "rb"); //Открывает файл на чтение в бинарном режиме.
  //f1 == 0 если файл не был открыт
  //читать так:
  int * ptr = new int [10];
  int size = sizeof(int);
  int n = 10;
  fread(ptr, size, n, f1);
  //ptr - указатель куда читать данные
  //size - размер блока, n - кол - во блоков, f1 - указатель на файл.
  //ф-я возвращает кол-во прочитанных блоков 
  fclose(f);
}


в общем хелп тебе в помощь, будут вопросы - пиши. smile

Автор: Alexeis 19.10.2007, 16:05
Цитата(344092 @  19.10.2007,  14:02 Найти цитируемый пост)
Как можно прочесть эти файлы связав их вместе? В Delphi есть параметр

--AssignFile-- Связывает дескриптор файла с бинарным или текстовым файлом

  Это не в делфи, а в паскале. В Delphi этот механизм оставлен лишь для совместимости с паскалем. В Delphi/C++ Builder с этой задачей эффективно справляется класс TFileStream.

Автор: 344092 19.10.2007, 17:59
Спасибо 

Цитата

f1 = fopen("Имя файла", "rb"); //Открывает файл на чтение в бинарном режиме.


А что такое "rb"  ???


Мне нужно считать с двух файлов информацию по-байтно справа налево в одном файле
типа 1.dat данные а в другом 1.src информация о блоках первого файла.

т.е мне както надо считать их вместе.... 

Код

AnsiString text; 
TFileStream *in = new TFileStream("с:1.dat",fmOpenRead); // открываю файл..а как подключить второй? 1.src
if( in != NULL ) { 
   int size; 
   in->Read(&size, sizeof(size)); 
   if( size != 0 ) { 
      try { 
         text.SetLength(size); 
         in->Read((void *)(text.data()), size); 
      } catch( EOutOfMemory& ) {} 
   } 
} 
delete in; 


-----------Вот информация о файлах-------

Информация выводится блоками по 2Кбайта. Один блок содержит 84 записи, вначале каждого блока записывается 64 нуля ( 32 байта). Одна запись имеет длину 24 байта и содержит поля:

7 знаков,16 знаков

длиной блоков данных  в 2048 байтов

Что то вроде того.... 

Блок данных - 2048 байтов  (84 записи по 24 байта)

00190     00 00 00 ¦ 00 00 00 00 ¦ 00 00 00 00 ¦ 00 00 00 00
001A0  00 00 00 00 ¦ 00 00 00 00 ¦ 00 00 00 00 ¦ 00 00 00 00
001B0  00 11 60 14 ¦ 51 16 50 14 ¦ FF FF FF FF ¦ F0 79 90 52
001C0  11 15 72 50 ¦ 00 01 30 00 ¦ 14 11 65 87 ¦ 55 44 13 7F
001D0  FF FF FF FF ¦ F0 69 90 52 ¦ 11 15 73 20 ¦ 00 11 10 00
001E0  71 11 61 14 ¦ 21 16 79 15 ¦ FF FF FF FF ¦ F0 79 90 52
001F0  11 15 73 30 ¦ 00 04 60 00 ¦ 46 11 69 93 ¦ 71 17 03 63
00200  FF FF FF FF ¦ F0 79 90 52 ¦ 11 15 73 40 ¦ 00 04 90 00
00210  49 11 67 90 ¦ 55 65 06 5F ¦ FF FF FF FF ¦ F0 69 90 52
00220  11 15 73 50 ¦ 00 00 60 00 ¦ 06 11 66 80 ¦ 41 16 74 06
00230  FF FF FF FF ¦ F0 79 90 52 ¦ 11 15 74 20 ¦ 00 05 80 00
00240  58 11 62 38 ¦ 25 67 41 8F ¦ FF FF FF FF ¦ F0 69 90 52
00250  11 15 74 40 ¦ 00 11 60 00 ¦ 76 11 67 91 ¦ 01 16 79 07
00260  FF FF FF FF ¦ F0 79 90 52 ¦ 11 15 75 10 ¦ 00 01 00 00
00270  10 11 69 88 ¦ 91 16 88 86 ¦ FF FF FF FF ¦ F0 79 90 52
00280  11 15 75 10 ¦ 00 02 30 00 ¦ 23 11 60 36 ¦ 61 16 80 48
00290  FF FF FF FF ¦ F0 79 90 52 ¦ 11 15 75 20 ¦ 00 15 80 01
002A0  18 11 70 44 ¦ 11 17 29 71 ¦ FF FF FF FF ¦ F0 79 90 52
002B0  11 15 75 70 ¦ 00 03 10 00 ¦ 31 11 68 92 ¦ 71 17 05 85
002C0  FF FF FF FF ¦ F0 79 90 52 ¦ 11 15 80 50 ¦ 00 21 10 01
002D0  31 11 70 81 ¦ 91 17 29 59 ¦ FF FF FF FF ¦ F0 79 90 52
002E0  11 15 81 00 ¦ 00 03 10 00 ¦ 31 11 62 33 ¦ 81 16 07 57
002F0  FF FF FF FF ¦ F0 79 90 52 ¦ 11 15 81 30 ¦ 00 55 30 03
00300  53 11 71 09 ¦ 31 17 10 29 ¦ FF FF FF FF ¦ F0 79 90 52
00310  11 15 82 00 ¦ 00 01 60 00 ¦ 16 11 69 64 ¦ 71 16 90 49
00320  FF FF FF FF ¦ F0 79 90 52 ¦ 11 15 82 60 ¦ 00 01 60 00
00330  16 11 70 57 ¦ 81 17 12 40 ¦ FF FF FF FF ¦ F0 79 90 52


Первый файл 1.dat содержит непосредственно информацию, а второй - наличее и длину блоков ,  Информацию в данных файлах необходимо читать по-байтно справа налево...... 

ShowMessage(text);


Автор: 0lmer 20.10.2007, 17:05
попробуй прочитать сначала из второго файла информацию о первом, а потом уже читать из первого файла.

Цитата(344092 @  19.10.2007,  17:59 Найти цитируемый пост)
А что такое "rb"  ???

"rb" - параметры открытия файла, r - на чтение, b - бинарный режим.

как читать справа налево не в курсе но можно попробовать считать данные куда нибуть типа стека, считал слева на право, а потом оттуда уже получится справа налево.

Автор: 344092 21.10.2007, 01:20
Разобрался с форматами.....

Считывать справа налево не надо..А вот буфер нужен.Вот кусок кода данной программы на Delphi с пояснением. Так вот как структуру под C++ заточить пока палки в колёса.


Код Delphi
Код


buf: array[0..2051] of byte; //буфер для данных
l:longint; //переменная для длины блока

while not(eof(spr)) do begin             //цикл обработки spr файла до конца

read(spr,l);                        //считываем длину блока  в l

blockread(dat,buf,l,re);     //счибываем блок заданной длины l в buf

//далее обрабатываем    buf  А блоки там 24-битные  если длина блока l<>2052 то это не блок 



;-(

Автор: 344092 26.10.2007, 11:51
Народ а чем можно заменить Delphi-вский     IntToHex ???? из десятеричной системы счисления в шестнадцатеричную систему 


Автор: Alexeis 26.10.2007, 11:58
  А зачем менять? Он и в билдере есть 
Цитата

AnsiString IntToHex (int Value, int Digits);

Автор: 344092 26.10.2007, 12:26
Спасибо  Alexeis, 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)