Arquivos binários

Delphi

06/10/2003

Tenho uma aplicação que usa arquivos de texto para buscar informações de configuração.
Estes arquivos estão em texto e gostaria de trabalhar com binários.

Só não sei como.

Se alguem puder informar um tutorial ou uma dica...


Valeu!


Koplin

Koplin

Curtidas 0

Respostas

Beppe

Beppe

06/10/2003

Que tipos de dados vc pensa em gravar?


GOSTEI 0
Koplin

Koplin

06/10/2003

Texto simples - Na verdade eu uso arquivos de texto para salvar consultas SQL e algumas linhas de comando - um script. Mas quero no formato binário.

Fiz uma pesquisa e achei algumas dicas e vou analisar, mas sua colaboração será muito bem vinda.

Valeu sua atenção.


GOSTEI 0
Beppe

Beppe

06/10/2003

Por quê a necessidade de binário? Para encriptar?
Os textos são de tamanho fixo? Quantos são?


GOSTEI 0
Koplin

Koplin

06/10/2003

Em verdade, sim e também para conhecer o uso dos binários. O texto resolve, mas se amanha eu precisar do binário, esta é uma boa chance de estudá-los.

Não os textos são de tamanhop variável. Mas posso dizer que nenhum arquivo terá mais do que 100k (formato texto)


GOSTEI 0
Beppe

Beppe

06/10/2003

Tá usando TStream ou file of ...


GOSTEI 0
Koplin

Koplin

06/10/2003

Não saquei...

Coloco as informações de texto em uma TStringList e salvo como .txt

Se a pergunta é sobre binários o que eu tenho e vou analizare usa AssignFile, read e reWrite.


GOSTEI 0
Beppe

Beppe

06/10/2003

Para ler:
var
  F: File of Char;
  S: String;
begin
  AssignFile(F, ´data.dat´);
  try
    Reset(F);
    SetLength(S, FileSize(F));
    Read(F, Pointer(S)^, Length(S));  
  finally
    CloseFile(F);
  end;
end;


Para escrever:
var
  F: File of Char;
  S: String;
begin
  AssignFile(F, ´data.dat´);
  try
    Rewrite(F);
    Write(F, Pointer(S)^, Length(S));  
  finally
    CloseFile(F);
  end;
end;


Reset: abre para leitura
Rewrite: limpa e abre para escrita


GOSTEI 0
Koplin

Koplin

06/10/2003

Nunca obtive uma resposta tão rápida.
Exato o que preciso.

Obrigado, Ataliba. Precisando...


GOSTEI 0
Flavio Sanches

Flavio Sanches

06/10/2003

engraçado....
comigo num deu certo
retornou oseguinte erro:

[Error] Unit1.pas(49): Incompatible types: ´Char´ and ´procedure, untyped pointer or untyped parameter´[Error] Unit1.pas(49):


GOSTEI 0
Beppe

Beppe

06/10/2003

o problema é em cima de qual linha?


GOSTEI 0
Ipc$

Ipc$

06/10/2003

BlockRead, BlockWrite


GOSTEI 0
Fórum Vini

Fórum Vini

06/10/2003

Beppe,
realmente o seu código tava dando um erro de sintaxe porque o arquivo era of Char.. eu fiz umas mudanças nele.. funcionou, mas não sei se está da forma como deveria ser:
var
  F: File;
  S: String;
begin
  AssignFile(F, ´C:\data.dat´);
  try
    Rewrite(F, Length(S));
    Write(F, Pointer(S)^);
  finally
    CloseFile(F);
  end;
end;


T+,
Vinicius;


GOSTEI 0
Fórum Vini

Fórum Vini

06/10/2003

Beppe,
realmente o seu código tava dando um erro de sintaxe porque o arquivo era of Char.. eu fiz umas mudanças nele.. funcionou, mas não sei se está da forma como deveria ser:
var
  F: File;
  S: String;
begin
  AssignFile(F, ´C:\data.dat´);
  try
    Rewrite(F, Length(S));
    Write(F, Pointer(S)^);
  finally
    CloseFile(F);
  end;
end;


T+,
Vinicius;


GOSTEI 0
Beppe

Beppe

06/10/2003

Realmente Vini, tem um problema sim. isto pq Write escreve um componente(unidade) por vez. No caso de File of Char, o tamanho em bytes a ser escrito é SizeOf(Char) = 1.

Write toma uma lista de argumentos do tipo Char. Uma string poderia ser impressa com:
Write(F, S[1], S[2], S[3], S[4], S[5], ...)

Mas é mais útil a rotina
BlockWrite(F, Pointer(S)^, Length(S))

O mesmo acontece com Read e BlockRead. BlockRead/BlockWrite recebe como argumento a largura do buffer passado, em cada invocação. Diferente de Read/Write.

Um detalhe a ser cuidado é a diferença no tratamento de arquivos tipados(file of ...;) e não-tipados(file;). O tamanho do registo destes últimos é definido no tempo de abertura do arquivo com Reset/Rewrite, parâmetro RecSize.


GOSTEI 0
POSTAR