Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запись/чтение файла с помощью TFileStream [D7, WinXP]


BOA_KAA ©   (2004-07-15 15:47:00) 

Помогите с проблемой, уже почти весь день бьюсь :(
Дело такое. Ни с того ни с сего перестало читаться целое число в самом начале файла, хотя раньше все нормально работало.
Запись идет так: fsFile.Write(temp, SizeOf(Integer));
Чение так: fsFile.Read(temp, SizeOf(Integer));
то есть ничего сверхестественного. tempобъявлен как Integerв обоих случаях.
При трассировке выяснилось, что читается какое-то безумное число, но в некоторых случаях (!) почему-то читается правильно :(((((

Заранее признателен за подсказки!


BOA_KAA   (2004-07-15 17:03:00) [1]


> romeo   (15.07.04 16:44) [15]

Вот ведь, а? Слов нет. Видимо, умудрился случайно затереть :(
Оффтопик ответом оказался :) Спасибо огромное!


clickmaker   (2004-07-15 16:56:00) [2]

Может все-таки дело в пути к файлу?
Попробуй вместо TFileStream поюзать АПИ: CreateFile, WriteFile, ReadFile


BOA_KAA   (2004-07-15 16:46:00) [3]


> clickmaker ©   (15.07.04 16:40) [14]

Если я правильно понял вопрос, то да. Кроме того, состряпал на скорую руку программку, которая читает только это число. Читает правильно... :(


romeo   (2004-07-15 16:44:00) [4]


>      // Читаем информацию о версии файла
>      fsFile.Read(temp, SizeOf(Integer));  // размер строки
>      fsFile.Read(St, temp);               // инф.

Оффтопик
Разве не нужно делать SetLength(St, temp)?

И, наверное fsFile.Read(St [1], temp)?


clickmaker   (2004-07-15 16:40:00) [5]


> BOA_KAA ©   (15.07.04 16:38) [13]

Если файл посмотреть в двоичном виде, в ФАРе, например, там это число нормальное?


BOA_KAA   (2004-07-15 16:38:00) [6]


> romeo   (15.07.04 16:26) [12]

Нет, имя напрямик задается


> Anatoly Podgoretsky ©   (15.07.04 16:25) [11]

Собственно говоря, эта самая часть уже как раз приведена. Но, раз уж так, то приведу более-менее полностью.
Запись:

const
 Version = 'NumGrid v.1.0';

procedure TNumGrid.SaveToFile(AFileName: String);
var
 fsFile: TFileStream;  // Файл, с которым работаем
 ACol, ARow,     // Номера ячеек таблицы
 temp: Integer;  
 St: String;    
 b: Boolean;    
begin
 // Создаем экземпляр TFileStream в привязке к AFileName
 fsFile:=TFileStream.Create(AFileName,
                            fmCreate or fmOpenWrite);

 try
   try
     (******************************  1  *******************************)
     // Записываем информацию о версии файла
     temp:=Length(Version);
     fsFile.Write(temp, SizeOf(Integer));  // размер строки
     fsFile.Write(Version[1], temp);       // инф.

     (******************************  2  *******************************)
     // Число столбцов в Grid'е
     fsFile.Write(ColCount, SizeOf(Integer));
     // Число строк в Grid'е
     fsFile.Write(RowCount, SizeOf(Integer));
     // Число фиксированных столбцов в Grid'е
     fsFile.Write(FixedCols, SizeOf(Integer));
     // Число фиксированных строк в Grid'е
     fsFile.Write(FixedRows, SizeOf(Integer));

     (******************************  3  *******************************)
     // Ширина столбцов
     for ACol:=0 to ColCount-1 do
     begin
       temp:=ColWidths[ACol];
       fsfile.Write(temp, SizeOf(Integer));
     end;
     // Высота строк
     for ARow:=0 to RowCount-1 do
     begin
       temp:=RowHeights[ARow];
       fsfile.Write(temp, SizeOf(Integer));
     end;

//// и тому подобные опции /////

     (******************************  6  *******************************)
     // Теперь непосредственно содержание Grid'а
     for ACol:=0 to ColCount-1 do
       for ARow:=0 to RowCount-1 do
       begin
         temp:=Length(Cells[ACol,ARow]); // размер ячейки
         fsFile.Write(temp, SizeOf(Integer));  // запись размера ячейки
         St:=Cells[ACol,ARow];
         fsFile.Write(St[1], temp);  // содержание ячейки
       end;
   except
     MessageDlg('Unable to save file'#13#10+AFileName, mtError, [mbOK], 0);
   end;
 finally
   fsFile.Free;
 end;
end;


И чтение, соответственно:

procedure TNumGrid.LoadFromFile(AFileName: String);
var
 fsFile: TFileStream;  // Файл, с которым работаем
 ACol, ARow,     // Номера ячеек таблицы
 temp: Integer;  
 St: String;    
 b: Boolean;    
begin
 // Создаем экземпляр TFileStream в привязке к FileName
 fsFile:=TFileStream.Create(AFileName, fmOpenRead);
 try
   try
     (******************************  1  *******************************)
     // Читаем информацию о версии файла
     fsFile.Read(temp, SizeOf(Integer));  // размер строки
     fsFile.Read(St, temp);               // инф.
     if St <> Version then
     begin
       MessageDlg('Unable to open file of this version',
         mtError, [mbOK], 0);
       fsFile.Free;
       Exit;
     end;

     (******************************  2  *******************************)
     // Число столбцов в Grid'е
     fsFile.Read(temp, SizeOf(Integer));
     ColCount:=temp;
     // Число строк в Grid'е
     fsFile.Read(temp, SizeOf(Integer));
     RowCount:=temp;
     // Число фиксированных столбцов в Grid'е
     fsFile.Read(temp, SizeOf(Integer));
     FixedCols:=temp;
     // Число фиксированных строк в Grid'е
     fsFile.Read(temp, SizeOf(Integer));
     FixedRows:=temp;

................................................................

     (******************************  6  *******************************)
     // Теперь непосредственно содержание Grid'а
     for ACol:=0 to ColCount-1 do
       for ARow:=0 to RowCount-1 do
       begin
         fsFile.Read(temp, SizeOf(Integer));  // размер ячейки
         SetLength(St, temp);   // Устанавливаем длину в соотв. с temp
         fsFile.Read(St[1], temp);   // содержание ячейки
         Cells[ACol,ARow]:=St;
       end;
   except
     MessageDlg('Unable to open file'#13#10+AFileName, mtError, [mbOK], 0);
   end;
 finally
   fsFile.Free;
 end;
end;


romeo   (2004-07-15 16:26:00) [7]


> > romeo   (15.07.04 16:08) [6]
>
> Да, разумеется.

Просто у меня был похожий косяк.
Сначала читал в поток из файла, указывая имя файла коротко 'myFile.ext'(т.е. предполоагалось что файл находится в одном каталоге с экзешником).
И точно также потом записывал. Все никак не мог понять, почему все выполнялось нормально, но содержимое файла не обновлялось.

Ларчик открывался просто. В процессе работы проги при помощи OpenDialog'a с не взведенной опцией "ofNoChangeDir" открывались другие файлы, и запись из потока происходила в последнюю выбранную в диалоге директорию.


Anatoly Podgoretsky   (2004-07-15 16:25:00) [8]

Так ты код записи и чтения приведи, а не обрывки, но только нужную часть, а не все.


BOA_KAA   (2004-07-15 16:22:00) [9]

Проверил позицию - в начале


Anatoly Podgoretsky   (2004-07-15 16:15:00) [10]

А с того эе места читаешь, похоже нет.


BOA_KAA   (2004-07-15 16:11:00) [11]


> romeo   (15.07.04 16:08) [6]

Да, разумеется.


BOA_KAA   (2004-07-15 16:11:00) [12]

Да, может быть еще вот что. Это строчки из компонента, которого я уже полгода назад написал весь этот срок успешно использовал.
А вчера в тот же package добавил 2 ActiveX-компонента (MathCAD).
Это могло как-то что-то...?


romeo   (2004-07-15 16:08:00) [13]

А считывание точно происходит из того же файла, куда и записывалось?


romeo   (2004-07-15 16:06:00) [14]


> Ни с того ни с сего перестало читаться

А вчера работало?


BOA_KAA   (2004-07-15 16:02:00) [15]

А вот не удается определить, как ни странно, опять же. Пытался проверять при трассировке, но упорно значение x:=fsFile.Read(temp, SizeOf(Integer)) не дает :(


Ega23   (2004-07-15 15:58:00) [16]

А чему равно fsFile.Read(temp, SizeOf(Integer)) ?


BOA_KAA   (2004-07-15 15:55:00) [17]

Нет, вроде. Первая строка за созданием потока

 fsFile:=TFileStream.Create(AFileName, fmOpenRead);

 try
   try
     (******************************  1  *******************************)
     // Читаем информацию о версии файла
     fsFile.Read(temp, SizeOf(Integer));  // размер строки


clickmaker   (2004-07-15 15:51:00) [18]

fsFile.Read(temp, SizeOf(Integer)); сразу после создания потока, никаких Seek'ов быть не может ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо