![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите найти ошибку в коде
Виктор © (2008-05-13 13:30:00)Здравствуйте! Мне необходимо сравнить 2 файла 111.zzz и 222.zzz и найти номер байта с которого они различаются, написал простенькую программку, а она не работает, в чём косяк, подскажите, а то что-то я торможу :(
Вот сама прога:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
i,j,k:integer;
f,f1:file;
buf,buf1:byte;
begin
assignFile(f,'c:\111.zzz');
reset(f);
assignFile(f1,'c:\222.zzz');
reset(f1);
i:=0;
seek(f,0);
seek(f1,0);
while i<=FileSize(f) do
begin
BlockRead(f,buf,1);
BlockRead(f1,buf1,1);
if buf<>buf1 then
showMessage(IntToStr(i));
inc(i);
seek(f,i);
seek(f1,i);
end;
closeFile(f);
closeFile(f1);
end;
end.
Leonid Troyanovsky (2008-05-13 13:59:00) [1]
> Виктор (13.05.08 13:30)
> Вот сама прога:
function CompStream(Stream1, Stream2: TStream): Boolean;
const
bufsize = $1000;
var
buf1, buf2: array [0..bufsize-1] of Byte;
nb1, nb2 : Longint;
begin
Result := Stream1.Size = Stream2.Size;
if not Result then
Exit;
while (Stream1.Position < Stream1.Size) do
begin
nb1 := Stream1.Read(buf1, bufsize);
nb2 := Stream2.Read(buf2, bufsize);
Result := nb1 = nb2;
if not Result then
raise Exception.Create('Compare error');
Result := CompareMem(@buf1, @buf2, nb1);
if not Result then
Exit;
end;
end;
--
Regards, LVT.
Palladin (2008-05-13 13:57:00) [2]там вообще все seekи лишние, и file лишнее, на кой хрен работать с нетипизированными файлами с целью блочного чтения целого одного байта, фигли на такси за хлебом ездить
Сергей М. (2008-05-13 13:55:00) [3]
> Ну, да, выдаёт ошибку
Что, вот прямо так и говорит - "выдаю ошибку" ?
Или не царское это дело - анализировать содержание реальногосообщения об ошибке ?
Lumen (2008-05-13 13:50:00) [4]>Виктор (13.05.08 13:30)
Мне кажется, оба Seek лишние, после BlockRead указатель там где ему и положено быть. Ну а по существу, необходимо:
reset(f, 1) и reset(f1, 1);
Palladin (2008-05-13 13:45:00) [5]а он и будет выдавать, ты не указал размер считываемой единицы, а по умолчанию он, по моему, 127, потому указывая BlockRead(f,buf,1); ты читаешь не 1 байт, как тебе кажется, а 127, отсюда и кирдык... читать книжки нужно...
Виктор (2008-05-13 13:39:00) [6]
> Что, прямо так и заявляет - "не работаю" ?
Ну, да, выдаёт ошибку, хотя код вроде правильный, файлы с такими именами существуют...
Виктор (2008-05-13 13:36:00) [7]Большое спасибо!!
Сергей М. (2008-05-13 13:33:00) [8]
> она не работает
Что, прямо так и заявляет - "не работаю" ?
Palladin (2008-05-13 13:31:00) [9]http://www.delphimaster.ru/cgi-bin/forum.pl?id=1204046814&n=10