Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2012, 23:08   #1
Finnesko
 
Аватар для Finnesko
 
Регистрация: 09.11.2012
Сообщений: 5
По умолчанию Поблоковая запись в файл(BlockWrite)

Помогите плиз.
Вот код:
Код:
var
  I,J,N,M : Integer;
  F : File;
  Str:string;

begin
 AssignFile(F,Fn);
  try
    Rewrite(F,1);
    BlockWrite(F, FRows, SizeOf(FRows));
    BlockWrite(F, FColumns, SizeOf(FColumns));
    for I := 0 to FRows-1 do
     for J := 0 to FColumns-1 do
        BlockWrite(F, Fvalues[I,J], SizeOf(Fvalues[I,J]));
  finally
    CloseFile(F);
  end;
end;
/////////////////

где
FRows,Fcolumns:integer
FRows:=5;
FColumns:=5;
FValues-масcив типа integer
//////////////////
И пишит ошибку -> BlockWrite(F, FRows, SizeOf(FRows));
BlockWrite(F, FColumns, SizeOf(FColumns));
помогите плз исправить. А если чесно я незнаю как зделать поблоковую запись типа integer( . Этот код записывает и читает тип double гуд но мне нужно через integer=/



________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 09.11.2012 в 23:52.
Finnesko вне форума Ответить с цитированием
Старый 09.11.2012, 23:54   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Какую ошибку пишет? Ошибка выдаётся компилятором или во время выполнения программы?

дайте кусок кода, где у Вас описаны FRows,Fcolumns


а так, вроде всё нормально. должно работать.

точно. проверил код.
всё работает.
ищите ошибку в другом месте!

пруф
Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  Fn = 'D:\myFile$.dat';
var
  I,J,N,M : Integer;
  F : File;
  Str:string;
  FRows, FColumns : integer;
  Fvalues : array[0..100,0..100] of integer;
begin
  FRows := 2;
  FColumns := 10;
  AssignFile(F,Fn);
  try
    Rewrite(F,1);
    BlockWrite(F, FRows, SizeOf(FRows));
    BlockWrite(F, FColumns, SizeOf(FColumns));
    for I := 0 to FRows-1 do
     for J := 0 to FColumns-1 do
        BlockWrite(F, Fvalues[I,J], SizeOf(Fvalues[I,J]));
    ShowMessage('файл '+Fn+' успешно создан!');
  finally
    CloseFile(F);
  end;
end;

Последний раз редактировалось Serge_Bliznykov; 09.11.2012 в 23:59.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.11.2012, 11:26   #3
Finnesko
 
Аватар для Finnesko
 
Регистрация: 09.11.2012
Сообщений: 5
По умолчанию

Ошибка выдаётся во время выполнения этой процедуры, когда я сохраняю данные в файл(записываю).
Вот полностью весь код:
Код:
unit Matrix;
interface
uses SysUtils, Classes;

 type
  ELoadFile = class(Exception);


TMatrix = class

  private
  FValues : array [0..100, 0..100] of integer;
  FRows, FColumns : integer;


  protected
   function GetRows: integer;
    function GetValues(ARow, ACol: integer): integer;
    procedure SetRows(AValue: integer);
    procedure SetValues(ARow, ACol: integer; AValue: integer);
    function GetColumns: integer;
    procedure SetColumns(AValue: integer);


  public
  Constructor create;
  property  mas[ARow, ACol: integer]: integer read GetValues write SetValues; Default;
  property   N : integer read GetRows write SetRows;
  property  M : integer read GetColumns write SetColumns;
  procedure LoadMatrixFromFileBin( FileName: string);
  procedure SaveMatrToFileBin(Fn: string);
  procedure SaveMatrToFile(FileName: string);
  procedure LoadMatrixFromFile( FileName: string);

  end;

implementation



const
  Leb = 'Матрица';
  FileSign = 'Матрица';
function TMatrix.GetRows: integer;
begin
If (FRows < 0)  then
  raise EmathError.Create('Ошибка значения индекса');
 result:= FRows;
end;



constructor TMatrix.create;
begin
FRows :=1;
FColumns := 1;
end;

function TMatrix.GetColumns: integer;
begin
If (FColumns < 0)  then
  raise EmathError.Create('Ошибка значения индекса') ;
   result:= FColumns;
end;

function TMatrix.GetValues(ARow, ACol: integer): integer;
begin
If (ARow < 0) or (ARow > FRows-1 ) or (ACol < 0) or (ACol > FColumns-1 ) then
  raise EmathError.Create('Ошибка значения индекса');
 result := FValues[ARow,ACol];
end;


procedure TMatrix.LoadMatrixFromFile(FileName: string);
var
  Sign: String;
  F: TextFile;
  I, J: Integer;
begin
  AssignFile(F, FileName);
  try
    try
      Reset(F);
      Readln(F, Sign);
      if Sign <> FileSign then
        raise EInOutError.Create('Файл поврежден');
        Readln(F, FRows);
        Readln(F, FColumns);
        if (FRows < 1) or (FColumns < 1) then
          raise EInOutError.Create('Неправильные значение!');

        for I := 0 to FRows - 1 do
          for J := 0 to FColumns - 1 do
            Readln(F, FValues[I, J]);
    except
      on E: Exception do
        raise EInOutError.Create('Файл не загружен!');
    end;
  finally
    CloseFile(F);
  end;

end;

procedure TMatrix.LoadMatrixFromFileBin(FileName: string);
var
  I,J : Integer;
  F : File;
  D : ShortString;
begin
  AssignFile(F,FileName);
  try
    Reset(F,1);
   SetLength(D,16);
    BlockRead(F, D[1], 16);
    if D <> Leb then
      raise ELoadFile.Create('Файл поврежден');
    BlockRead(F, FRows, SizeOf(FRows));
    BlockRead(F, FColumns, SizeOf(FColumns));
    for I := 0 to FRows-1 do
      for J := 0 to FColumns-1 do
        BlockRead(F, FValues[I,J], SizeOf(FValues[I,J]));

  finally
    CloseFile(F);
  end;
end;





procedure TMatrix.SetRows(AValue: integer);
begin
 if (Avalue<1)or (AValue > 100) then
    raise EMathError.Create('Ошибка значения размера');
    FRows := AValue ;
end;



procedure TMatrix.SaveMatrToFile(FileName: string);
var
   F: TextFile;
   I, J: integer;
begin
   AssignFile (F, FileName);
   try
     Rewrite (F);
      writeln (F, FileSign);
      writeln (F);
      writeln (F, FRows);
      writeln (F, FColumns);
      writeln (F);
      for I := 0 to FRows-1 do
        for J := 0 to FColumns-1 do
          writeln (F, FValues[I, J]);
   finally
      CloseFile (F);
   end;

end;

procedure TMatrix.SaveMatrToFileBin(Fn: string);
var
  I,J : Integer;
  F : File;
begin
 AssignFile(F,Fn);
  try
    Rewrite(F,1);
    BlockWrite(F, Leb, 16);
    BlockWrite(F, FRows, SizeOf(FRows));
    BlockWrite(F, FColumns, SizeOf(FColumns));
    for I := 0 to FRows-1 do
      for J := 0 to FColumns-1 do
        BlockWrite(F, Fvalues[I,J], SizeOf(Fvalues[I,J]));
  finally
    CloseFile(F);
  end;
end;

procedure TMatrix.SetColumns(AValue: integer);
begin
   if (Avalue<1)or (AValue > 100) then
    raise EMathError.Create('Ошибка значения размера');
    FColumns := AValue ;
end;

procedure TMatrix.SetValues(ARow, ACol: integer; AValue: integer);
begin
  FValues[ARow,ACol]:= AValue;
end;


end.
Вот скрин ошибки http://www.programmersforum.ru/attac...1&d=1352532330
Изображения
Тип файла: jpg 2012-11-10_112034.jpg (31.1 Кб, 146 просмотров)
Finnesko вне форума Ответить с цитированием
Старый 10.11.2012, 13:25   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Скриншот совсем не видно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.11.2012, 13:44   #5
Finnesko
 
Аватар для Finnesko
 
Регистрация: 09.11.2012
Сообщений: 5
По умолчанию

О шибка тут
Код:
 BlockWrite(F, FRows, SizeOf(FRows));
Так делфи указывает((
Finnesko вне форума Ответить с цитированием
Старый 10.11.2012, 14:16   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
О шибка тут
С криншот п оказывает т екст о шибки
Но его н евидно
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.11.2012, 14:33   #7
Finnesko
 
Аватар для Finnesko
 
Регистрация: 09.11.2012
Сообщений: 5
По умолчанию

Вот текст ошибки.
И вот ещё исходник кину. Если смож помоги исправить.
Изображения
Тип файла: jpg Ошибка.jpg (29.5 Кб, 81 просмотров)
Finnesko вне форума Ответить с цитированием
Старый 10.11.2012, 14:53   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

сейчас посмотрю исходник.
но, для начала,
а зачем ЭТО?!
Цитата:
Код:
  BlockWrite(F, Leb, 16);
потому как почему 16 байт пишете?! Во-вторых, тип константы LEB определяется компилятором. Не исключено, что Leb будет AnsiString => Leb - это указатель на данные!

тогда, уже, хотя бы так попробуйте:
Код:
  BlockWrite(F, Leb[1], Length(Leb)*SizeOf(Char));

да и вообще, совсем не понятно, зачем строки в бинарном файле... но это уже, конечно, ваше право, что хотите, то и пишете!

Последний раз редактировалось Serge_Bliznykov; 10.11.2012 в 15:01.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.11.2012, 15:23   #9
Finnesko
 
Аватар для Finnesko
 
Регистрация: 09.11.2012
Сообщений: 5
По умолчанию

Да это можно ваще закоментить ,мне главное зделать запись данных о матрице и её содержимого.
Код:
 BlockWrite(F, FRows, SizeOf(FRows)); 
BlockWrite(F, FColumns, SizeOf(FColumns));
 for I := 0 to FRows-1 do for J := 0 to FColumns-1 do BlockWrite(F, Fvalues[I,J], SizeOf(Fvalues[I,J]));
Finnesko вне форума Ответить с цитированием
Старый 10.11.2012, 15:24   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, сохранение и не должно работать!
Вы обращаетесь к объекту Mat, который ещё НЕ СОЗДАН!

проверьте:
Код:
procedure TForm3.Savetobinari1Click(Sender: TObject);
begin
 if Not Assigned(mat) then
      Application.MessageBox( Pchar('Чтобы обращаться к объекту MAT, нужно его создать сначала!'),
                              'Ошибка',  MB_ICONERROR or MB_OK)
 else
   if SaveDialog1.Execute then
      Mat.SaveMatrToFileBin (SaveDialog1.FileName );
end;
заглянул в Task.Zapolnenie
я вообще в шоке о такого кода:
Цитата:
Код:
  FMatr:=TMatrix.create ;
  FMatr:=TMatrix.create ; // создали нашу матрицу 100х100
Вы вообще понимаете, что такое операция присвоения? И что такое ООП? И для чего нужно вызывать конструктор класса?...

Последний раз редактировалось Serge_Bliznykov; 10.11.2012 в 15:36.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись String через BlockWrite Alex Cones Общие вопросы Delphi 3 13.09.2010 20:47
Проблема с порчей данных через BlockWrite Alex Cones Общие вопросы Delphi 0 21.07.2010 19:45
BlockWrite Проверьте правильность, пожалуйста. Alex Cones Общие вопросы Delphi 3 18.11.2009 21:23
Проблема с Blockwrite inndim Общие вопросы Delphi 7 13.03.2009 08:38