高手们,请进!help,如觉得分不够,我还有一个同样问题300分相送(50分)

X

xieyj

Unregistered / Unconfirmed
GUEST, unregistred user!
我自己写了一个,请问一下为什么这样,只能写入一条记录.代码如下,怎么遍历读取出数据库里的所有记录:
如果不够,我还有一个同样问题300分相送
Type
TFileHead = Record
Version : string[10];
UpdateDate: TDatetime;
end;
Type
TFileData = Record
Name : string[30];
Phone : string[30];
Age : integer;
end;

Var
TFile: File;
FileHead: TFileHead;
FileData: TFileData;
FileSize: integer;
Const FileName: string = 'C:/a.xmd';
Function WriteRecord(Var F: File;
Data: TFileData): Boolean;
Function ReadRecord(Var F: File;
Data: TFileData): Boolean;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
If Not FileExists(FileName) then
begin
AssignFile(TFile, FileName);
ReWrite(TFile, 1);
FileHead.Version := '1.0.0';
FileHead.UpdateDate := Now;
BlockWrite(TFile, FileHead, SizeOf(FileHead));
CloseFile(TFile);
end;
AssignFile(TFile, FileName);
Reset(TFile, 1);
BlockRead(TFile, FileHead, SizeOf(FileHead));
BlockRead(TFile, FileData, SizeOf(FileData), FileSize);
edit1.Clear;
edit2.Clear;
edit3.Clear;
While FileSize = SizeOf(TFileData)do
begin
BlockRead(TFile, FileData, SizeOf(FileData), FileSize);
end;
CloseFile(TFile);
end;
{为何这里只能写入一条记录}
Function WriteRecord(Var F: File;
Data: TFileData): Boolean;
begin
Try
AssignFile(F, FileName);
ReWrite(F);
Try
BlockWrite(F, FileData, SizeOf(FileData) + 1);
Result := True;
Except
Result := False;
end;
Finally
CloseFile(F);
end;
end;

Function ReadRecord(Var F: File;
Data: TFileData): Boolean;
begin
Try
AssignFile(F, FileName);
Reset(F);
Try
BlockRead(F, FileData, SizeOf(FileData));
Result := True;
Except
Result := False;
end;
Finally
CloseFile(F);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
FileData.Name := edit1.Text;
FileData.Phone := edit2.Text;
FileData.Age := StrToInt(edit3.Text);
WriteRecord(TFile, FileData);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
ReadRecord(TFile, FileData);
edit1.Text := FileData.Name;
edit2.Text := FileData.Phone;
edit3.Text := IntToStr(FileData.Age);
end;
 

张鸿林

Unregistered / Unconfirmed
GUEST, unregistred user!
我没有调试,所加代码为伪代码
Function WriteRecord(Var F: File;
Data: TFileData): Boolean;
begin
Try
AssignFile(F, FileName);
ReWrite(F);//文件应该假设已经存在,用reset,
// seeek()到文件末
Try
BlockWrite(F, FileData, SizeOf(FileData) + 1);//为什么要+1?
Result := True;
Except
Result := False;
end;
Finally
CloseFile(F);
end;
end;

Function ReadRecord(Var F: File;
Data: TFileData): Boolean;//函数参数应该加记录号
Function ReadRecord(Var F: File;
Data: TFileData;recno:integer): Boolean
begin
Try
AssignFile(F, FileName);
Reset(F);
Try
//seek(f, FileHead.size+(recno-1)*(FileData.size) 找到记录的起始位置
BlockRead(F, FileData, SizeOf(FileData));
Result := True;
Except
Result := False;
end;
Finally
CloseFile(F);
end;
end;
 
Z

zhjwjan

Unregistered / Unconfirmed
GUEST, unregistred user!
什么意思?你要往一个文件里写入多条记录?你每次都调用rewrite函数,它会清空已存在文件
或创建一个新文件。你要打开一个已存在的文件并在文件最后添加记录,用append函数。
 
X

xieyj

Unregistered / Unconfirmed
GUEST, unregistred user!
现我已改成TFileStream方式读写,这样以大数据读写不会出问题.但新的问题又出现了.
以下是原代码,为何在读操作处,我没有办法循环读取数据.读出来三个COMBOBOX都为空的.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
btncreate: TButton;
btnwrite: TButton;
btnread: TButton;
edit1: TComboBox;
edit2: TComboBox;
edit3: TComboBox;
procedure btncreateClick(Sender: TObject);
procedure btnwriteClick(Sender: TObject);
procedure btnreadClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Type
TFileHead = Record
Version : string[10];
UpdateDate: TDatetime;
end;
Type
TFileData = Record
Name : string[30];
Phone : string[30];
Age : integer;
end;

Var
FileStream: TFileStream;
FileHead: TFileHead;
FileData: TFileData;
FileSize: integer;
Const FileName: string = 'C:/a.xmd';
procedure CreateFile(TFileName: String);
implementation
{$R *.dfm}
{创建文件,判断是否存在,如果存在则可写打开}
procedure CreateFile(TFileName: string);
begin
If Not FileExists(TFileName) then
begin
FileStream := TFileStream.Create(TFileName, fmCreate);
FileHead.Version := '1.0.0.1';
Filehead.UpdateDate := Now;
FileStream.Write(FileHead, SizeOf(FileHead));
End
else
begin
FileStream := TFileStream.Create(TFileName, fmOpenWrite);
end;
end;
{创建文件}
procedure TForm1.btncreateClick(Sender: TObject);
begin
CreateFile(FileName);
FileStream.Read(FileHead, SizeOf(FileHead));
FileStream.Free;
end;
{写数据}
procedure TForm1.btnwriteClick(Sender: TObject);
begin
CreateFile(FileName);
FileData.Name := combo1.Text;
FileData.Phone := combo2.Text;
FileData.Age := StrToInt(combo3.Text);
FileStream.Seek(0, soFromEnd);
FileStream.Write(FileData, SizeOf(FileData));
FileStream.Free;
end;
{读数据,以下有问题}
procedure TForm1.btnreadClick(Sender: TObject);
var i: integer;
begin
CreateFile(FileName);
combo1.Clear;
combo2.Clear;
combo3.Clear;
FileStream.Seek(SizeOf(FileData), soFrombegin
ning);
FileSize := FileStream.Size - SizeOf(SizeOf(FileData));
While FileSize > 0do
begin
FileSize := FileSize - SizeOf(FileData);
FileStream.Seek(SizeOf(FileData), soFromEnd);
FileStream.Read(FileData, SizeOf(FileData));
combo1.Items.Add(FileData.Name);
读出来为空
combo2.Items.Add(FileData.Phone);
combo3.Items.Add(IntToStr(FileData.Age));
end;
FileStream.Free;
end;

end.
 
B

beautychina

Unregistered / Unconfirmed
GUEST, unregistred user!
你确认你的内容写道文件里了么,FileStream.Seek(SizeOf(FileData), soFromEnd);好像有问题,检查一下
 
E

erp2

Unregistered / Unconfirmed
GUEST, unregistred user!
预练次功必先自宫,
即使自宫未必成功,
若不自宫也可成功。
哈哈.............
http://www.3rcn.com
不想讨论这些问题:有时间请关注:
http://expert.csdn.net/Expert/topic/1613/1613419.xml?temp=.5817682
一个Borland中国北京、广州、上海公司都解决不了的问题呀!
中国还有高手吗???????????????
 

小熊跳舞

Unregistered / Unconfirmed
GUEST, unregistred user!
P

pcman_fly

Unregistered / Unconfirmed
GUEST, unregistred user!
看不懂你写的程序,高手不会把程序写得如此复杂,不敬地说,有点脱了裤子放屁的感觉
如果你用 TQuery 控件访问数据库第一个步骤,就要判断查询有没有返回
try
Query1.Open;
except
on E:EXCEPTIONdo
begin
..... //出错处理
end;
end;

if Query1.RecordCount < 1 then
begin

........
end;

// 然后如果又返回,则到第一条记录处
Query1.First;
// 之后,循环访问
while not Query1.Eofdo
begin

S := Query1.Fields[0].AsString;
// 这是读出第一列的内容。
..........
Query1.Next;
end;

Query1.Close;
-------------------------------------------------------------------------
另外,如果你要读写文本文件可以用以下语句:
var
F: TextFile;
S: String;
begin
AssignFile(F, '文件名');
Rewrite(F);
// 之后,循环访问
while not Query1.Eofdo
begin

S := Format('%s%d', [Query1.Fields[0].AsString, // 这是读出第一列的内容。
Query1.Fields[1].AsInteger // 这是读出第二列的内容。
WriteLn(F, S);
Query1.Next;
end;

Query1.Close;

CloseFile(F);
end;
 
R

rockythd

Unregistered / Unconfirmed
GUEST, unregistred user!
对于第一中方法,同意zhjwjan的意见;
对于第二种方法,好像是你在读取文件的定位时,有问题:
FileSize := FileStream.Size - SizeOf(SizeOf(FileData));
While FileSize > 0do
begin
FileSize := FileSize - SizeOf(FileData);// 问什么跳过第一个记录?
你插入两条以上的记录或许可以读到数据。
 
顶部