2011-04-23 28 views
8

Por alguna razón, mi cuenta OpenID ya no existe, incluso cuando la usé ayer. Pero de todos modos.Archivo simple de lectura/escritura .dat en Delphi

Necesito guardar datos de registro en un archivo .dat. Intenté realizar muchas búsquedas, pero todo estaba relacionado con las bases de datos y las cosas BLOB. No pude construir nada de eso.

que tienen el siguiente registro

type 
    Scores = record 
    name: string[50]; 
    score: integer; 
    end; 

var rank: array[1..3] of scores; 

Sólo necesito una forma sencilla de guardar y leer los datos de registro de un archivo .dat. Tenía el libro sobre cómo hacerlo, pero eso es en la escuela.

+0

SE Este http: //stackoverflow.com/q/3820996/654311 – Najem

+4

Debería prefijar sus tipos con una 'T'. Es decir. use 'TScores' como el nombre del tipo y' Scores' como el nombre de las variables. –

Respuesta

12

También debe echar un vistazo a la file of -method.

Esto es un poco obsoleto, pero es una buena manera de aprender a trabajar con archivos.

Dado que los registros con matrices dinámicas (incluidas las cadenas ordinarias) no pueden almacenarse en archivos con este método, las cadenas de caracteres unicode no serán compatibles. Pero string[50] se basa en ShortStrings y su registro es por lo tanto ya no Unicode ...

escribir en el archivo

var 
    i: Integer; 
    myFile: File of TScores; 
begin 
    AssignFile(myFile,'Rank.dat'); 
    Rewrite(myFile); 

    try 
    for i := 1 to 3 do 
     Write(myFile, Rank[i]); 
finally 
    CloseFile(myFile); 
end; 
end; 

Leer de archivo

var 
    i: Integer; 
    Scores: TScores; 
    myFile: File of TScores; 
begin 
    AssignFile(myFile, 'Rank.dat'); 
    Reset(myFile); 

    try 
    i := 1; 
    while not EOF(myFile) do 
    begin 
     Read(myFile, Scores); 
     Rank[i] := Scores;  //You will get an error if i is out of the array bounds. I.e. more than 3 
     Inc(i); 
    end; 
    finally 
    CloseFile(myFile); 
    end; 
end; 
+0

+1 Creo que esto es lo que él necesita para la escuela, el concepto básico de DB – ComputerSaysNo

+0

Sí, eso servirá. Muchas gracias. Muy sencillo. – Skeela87

+0

No es realmente ni siquiera un concepto de base de datos, simplemente la persistencia de registro binario plano en el disco. Tal vez el primogénito, o la forma más antigua conocida de hacer la persistencia binaria en la historia del desarrollo de software. Esta sintaxis se remonta a la sintaxis pascal de Wirth, y se usaba muy comúnmente en los viejos tiempos, cuando comencé a usar Turbo Pascal para DOS. –

1

Mire en la ayuda debajo de "blockread" y o "blockwrite". Probablemente habrá un ejemplo

+0

Ah, gracias, no sabía el término correcto. Voy a echar un vistazo e informar si esto resuelve mi problema o no. =) – Skeela87

4

Use streams. Aquí es una simple demo (en demo - en la práctica no hay necesidad de reabrir secuencia de archivo cada vez):

type 
    Scores = record 
    name: string[50]; 
    score: integer; 
    end; 

var rank: array[1..3] of scores; 

procedure WriteScores(var Buf; Count: Integer); 
var 
    Stream: TStream; 

begin 
    Stream:= TFileStream.Create('test.dat', fmCreate); 
    try 
    Stream.WriteBuffer(Buf, SizeOf(Scores) * Count); 
    finally 
    Stream.Free; 
    end; 
end; 

procedure ReadScore(var Buf; Index: Integer); 
var 
    Stream: TStream; 

begin 
    Stream:= TFileStream.Create('test.dat', fmOpenRead or fmShareDenyWrite); 
    try 
    Stream.Position:= Index * SizeOf(Scores); 
    Stream.ReadBuffer(Buf, SizeOf(Scores)); 
    finally 
    Stream.Free; 
    end; 
end; 

// write rank[1..3] to test.dat 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
    rank[2].name:= '123'; 
    WriteScores(rank, Length(Rank)); 
end; 

// read rank[2] from test.dat 
procedure TForm1.Button2Click(Sender: TObject); 
begin 
    rank[2].name:= ''; 
    ReadScore(rank[2], 2 - Low(rank)); 
    ShowMessage(rank[2].name); 
end; 
+0

Gracias por la respuesta, sin embargo, eso tiene poco sentido para mí. También podría ser demasiado para algo en un proyecto escolar. No es importante, puedo hacerlo como puedo cuando regrese a la escuela. – Skeela87

+2

+1 TStream es la forma más sólida de trabajar con archivos, aunque no es la más fácil de entender para los recién llegados. –

+0

Sí, ese es el problema. Si tuviera tiempo, felizmente lo aprendería. Pero los tiempos no son algo que tenga mucho en este momento, desafortunadamente. – Skeela87