Est ce que je peux ércire une suite de characteres directement ou il faut ecrire [Résolu]

Signaler
Messages postés
40
Date d'inscription
dimanche 25 janvier 2009
Statut
Membre
Dernière intervention
20 août 2009
-
Smith4400
Messages postés
40
Date d'inscription
dimanche 25 janvier 2009
Statut
Membre
Dernière intervention
20 août 2009
-
salut tous le monde !!!!
j'ai un tout petit problaime avec écrire des valeurs dans un bin
mon code est...
--------------------------------------------------------
var sTemp : string;
var sId : string;
var soft: char;
begin
     sTemp:=edit2.text; 
            soft:=chr(strtoint('$' + copy(sTemp,1,2)));
            c[22]:=soft;
            soft:=chr(strtoint('$' + copy(sTemp,3,2)));
            c[23]:=soft;
           
          Write(F,C);
          CloseFile(F);
          end
end;
------------------------------------------------------
ce code fonctionne normal mais moi je veux écrire tous une chaine une fois pour toute et pas a chaque foix je récrit c[22] et apres c[23] et apres c[24]
je vous t'attends
merci

7 réponses

Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
on se demande pourquoi je me suis cassé la nouille a mettre des commentaires aux fonctions ...

var K : integer;
  B : TBin;
  TFS : TFileStream;
begin
  Edit1.Test := 'FF12EE34DD56CC78BB90AA';

  K := StrToBin(Edit1.Text, B);
  if K > 0 then
  begin
    TFS := TFileStream.Create('c:\test.bin', fmCreate);
    try
      WriteBinToStream(TFS, B, K);
    finally
      TFS.Free;
    end;
  end;
end;

voila ...

<hr width="100%" size="2" />
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
en utilisant Seek ou position du stream pour te caler a l'offset de depart de la donnée a ecrire.

Stream.Seek(StartOffset, soFromEnd);
WriteBinToStream(....);
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
voila ce qu'il te faut depuis le debut :::

const
  MaxBinLength    = 4096;
  MaxBinStrLength = MaxBinLength shr 1;

type
  p2Bytes = ^T2Bytes;
  T2Bytes = array[0..1] of byte;
  TBin    = array[0..MaxBinLength-1] of byte;

{ StrToBin

  convertis une chaine qui represente une valeur hexa decimale en sa representation
  binaire (tableau de bytes).
  la taille maximale de ce tableau est donnée par la constante MaxBinLength,
  la taille maximale de la chaine entrante est donnée par la constante MaxBinStrLength

  PARAMETRES :
    S   [I] AnsiString, chaine representant une valeur hexadecimale
    Bin [O] TBin (Tableau de bytes), valeur binaire de la chaine

  RETOUR :
    integer, renvois la taille ecrite dans Bin ou code erreur (<= 0)
     0 : S est vide
    -2 : S n'as pas une taille valide (doit etre multiple de 2) : F est mauvais, 0F est ok
    -1 : la taille de S depasse la capacité du buffer (MaxBinLength)
    -3 : S possede des caracteres invalide (n'est pas dans 0123456789ABCDEFabcdef)

}
function StrToBin(const S : AnsiString; var Bin : TBin): integer;
var pW     : p2Bytes;
    N, L   : integer;
    W1, W0 : integer;
begin
  result := 0;

  if S = EmptyStr then
    exit;

  pW := @S[1];

  L := Length(S);
  if (L and $1) = $1 then
  begin
    result := -2;
    exit;
  end;

  result := L shr 1;
  if result > MaxBinLength then
  begin
    result := -1;
    exit;
  end;

  for N := 0 to result-1 do
  begin
    W0 := pW^[0];
    W1 := pW^[1];

    case W0 of
      $30..$39 : dec(W0, $30);
      $41..$46 : dec(W0, $37);
      $61..$66 : dec(W0, $57);
    else
      result := -3;
      exit;
    end;

    case W1 of
      $30..$39 : dec(W1, $30);
      $41..$46 : dec(W1, $37);
      $61..$66 : dec(W1, $57);
    else
      result := -3;
      exit;
    end;

    Bin[N] := byte((W0 shl 4) or W1);

    inc(pW);
  end;
end;

{ BinToStr

  Convertis un ensemble de valeurs binaire (TBin) en une chaine lisible. Sont fonctionnement
  est inverse a celui de StrToBin.

  PARAMETRES :
    Bin          [I] TBin, ensemble de valeurs binaire
    BinSize      [I] Integer, taille de l'ensemble de valeurs
    HexLowerCase [I] boolean, indique si il faut utiliser les caracteres minuscules (true) ou
                     majuscules (false).

  RETOUR :
    AnsiString, chaine contenant la representation textuelle des valeurs binaire contenues dans Bin.
    vide si BinSize <= 0.

}
function BinToStr(const Bin : TBin; const BinSize: integer; const HexLowerCase: boolean = true): AnsiString;
var pW : p2Bytes;
    N : integer;
    BI, BH, BL : byte;
const
  BIVAL : array[boolean] of byte = ($37, $57);
begin
  if BinSize = 0 then
    exit;

  BI := BIVAL[HexLowerCase];

  SetLength(result, BinSize shl 1);
  pW := @result[1];

  for N := 0 to BinSize-1 do
  begin
    BH := Bin[N] shr 4;
    BL := Bin[N] and $F;

    case BH of
      $0..$9 : inc(BH, $30);
      $A..$F : inc(BH, BI);
    end;

    case BL of
      $0..$9 : inc(BL, $30);
      $A..$F : inc(BL, BI);
    end;

    pW^[0] := BH;
    pW^[1] := BL;

    inc(pW);
  end;
end;

{ ReadBinFromStream

  lit les octets d'un flux et les places dans un tableau TBin.

  PARAMETRES :
    Stream  [I] TStream, Instance valide d'une classe TStream
    Bin     [O] TBin, contient les octets luts du flux
    BinSize [I] BinSize, nombres d'octets a lire

  RETOUR :
    integer, renvois le nombre d'octets copiés dans Bin (>= 1)
    0  : BinSize est definit a 0 ou inferieur a 0
    -1 : Stream invalide, pas instancié (create)
}
function ReadBinFromStream(Stream: TStream; var Bin: TBin; const BinSize: integer): integer;
begin
  result := 0;

  if BinSize <= 0 then
    exit;

  if not assigned(Stream) then
  begin
    result := -1;
    exit;
  end;

  result := Stream.Read(Bin[0], BinSize);
end;

{ WriteBinToStream

  Ecrit les octets contenus dans un tableau TBin dans un flux

  PARAMETRES :
    Stream  [I/O] TStream, Instance valide d'une classe TStream
    Bin     [I]   TBin, contient les octets a ecrire dans le flux
    BinSize [I]   BinSize, nombres d'octets a ecrire

  RETOUR :
    integer, renvois le nombre d'octets ecrit dans le flux (>= 1)
    0  : BinSize est definit a 0 ou inferieur a 0
    -1 : Stream invalide, pas instancié (create)
}
function WriteBinToStream(Stream: TStream; const Bin: TBin; const BinSize: integer): integer;
begin
  result := 0;

  if BinSize <= 0 then
    exit;

  if not Assigned(Stream) then
  begin
    result := -1;
    exit;
  end;

  result := Stream.Write(Bin[0], BinSize);
end;

<hr width="100%" size="2" />
Messages postés
40
Date d'inscription
dimanche 25 janvier 2009
Statut
Membre
Dernière intervention
20 août 2009

mais comment peux-je utilise ces fonctions la???
Messages postés
40
Date d'inscription
dimanche 25 janvier 2009
Statut
Membre
Dernière intervention
20 août 2009

f0xi
merci c très utiles + ça marche très bien
mais comment peux-je ouvrir le fichier sans l'écraser ??
car je veux juste écrire la table et pas faire un nouveau fichier et écrire dans...
merci infiniment



Smith
Messages postés
40
Date d'inscription
dimanche 25 janvier 2009
Statut
Membre
Dernière intervention
20 août 2009

f0xi
merci j'ai trouvé la répence correct

merci merci merci
---------------------------------
une autre chose
je veux chercher l'offset de des donnée que j'ai écris,j'ai trouvé une fonction
----------------------------------
ScanFile searches for a string in a file and returns the position of the string
in the file or -1, if not found.

ScanFile sucht in einer Datei nach dem Vorkommen
eines bestimmten Strings und gibt bei Erfolg die Position zurück, wo der String
gefunden wurde.
}

function ScanFile(const FileName: string;
const forString: string;
caseSensitive: Boolean): Longint;
const
BufferSize = $8001; { 32K+1 bytes }
var
pBuf, pEnd, pScan, pPos: PChar;
filesize: LongInt;
bytesRemaining: LongInt;
bytesToRead: Integer;
F: file;
SearchFor: PChar;
oldMode: Word;
begin
{ assume failure }
Result := -1;
if (Length(forString) 0) or (Length(FileName) 0) then Exit;
SearchFor := nil;
pBuf := nil;
{ open file as binary, 1 byte recordsize }
AssignFile(F, FileName);
oldMode := FileMode;
FileMode := 0; { read-only access }
Reset(F, 1);
FileMode := oldMode;
try { allocate memory for buffer and pchar search string }
SearchFor := StrAlloc(Length(forString) + 1);
StrPCopy(SearchFor, forString);
if not caseSensitive then { convert to upper case }
AnsiUpper(SearchFor);
GetMem(pBuf, BufferSize);
filesize := System.Filesize(F);
bytesRemaining := filesize;
pPos := nil;
while bytesRemaining > 0 do
begin
{ calc how many bytes to read this round }
if bytesRemaining >= BufferSize then
bytesToRead := Pred(BufferSize)
else
bytesToRead := bytesRemaining;
{ read a buffer full and zero-terminate the buffer }
BlockRead(F, pBuf^, bytesToRead, bytesToRead);
pEnd := @pBuf[bytesToRead];
pEnd^ := #0;
pScan := pBuf;
while pScan < pEnd do
begin
if not caseSensitive then { convert to upper case }
AnsiUpper(pScan);
pPos := StrPos(pScan, SearchFor); { search for substring }
if pPos <> nil then
begin { Found it! }
Result := FileSize - bytesRemaining +
Longint(pPos) - Longint(pBuf);
Break;
end;
pScan := StrEnd(pScan);
Inc(pScan);
end;
if pPos <> nil then Break;
bytesRemaining := bytesRemaining - bytesToRead;
if bytesRemaining > 0 then
begin
Seek(F, FilePos(F) - Length(forString));
bytesRemaining := bytesRemaining + Length(forString);
end;
end; { While }
finally
CloseFile(F);
if SearchFor <> nil then StrDispose(SearchFor);
if pBuf <> nil then FreeMem(pBuf, BufferSize);
end;
------------------------
mais elle cherche le type "string" et les données que je cherche sont "integer"

merci
Messages postés
40
Date d'inscription
dimanche 25 janvier 2009
Statut
Membre
Dernière intervention
20 août 2009

merci, j'ai trouvé la sollution