Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.01;
Скачать: CL | DM;

Вниз

Запись/чтение файла с помощью TFileStream   Найти похожие ветки 

 
BOA_KAA ©   (2004-07-15 15:47) [0]

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

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


 
clickmaker ©   (2004-07-15 15:51) [1]

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


 
BOA_KAA ©   (2004-07-15 15:55) [2]

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

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

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


 
Ega23 ©   (2004-07-15 15:58) [3]

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


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

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


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


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

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


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

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


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

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


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


> romeo   (15.07.04 16:08) [6]

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


 
Anatoly Podgoretsky ©   (2004-07-15 16:15) [9]

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


 
BOA_KAA ©   (2004-07-15 16:22) [10]

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


 
Anatoly Podgoretsky ©   (2004-07-15 16:25) [11]

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


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


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

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

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


 
BOA_KAA ©   (2004-07-15 16:38) [13]


> 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;


 
clickmaker ©   (2004-07-15 16:40) [14]


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

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


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


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

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

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


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


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

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


 
clickmaker ©   (2004-07-15 16:56) [17]

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


 
BOA_KAA ©   (2004-07-15 17:03) [18]


> romeo   (15.07.04 16:44) [15]

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



Страницы: 1 вся ветка

Текущий архив: 2004.08.01;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.032 c
14-1089882872
peypivo
2004-07-15 13:14
2004.08.01
просмотр фильмов


3-1089290948
BPK
2004-07-08 16:49
2004.08.01
Инсталляция снесла все ODBC-драйверы


9-1082455854
WondeRu
2004-04-20 14:10
2004.08.01
OpenGL Extensions


4-1087403443
DjOne
2004-06-16 20:30
2004.08.01
HookMenu


9-1080574510
TButton
2004-03-29 19:35
2004.08.01
DasTactics