Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];

Вниз

Запись/чтение файла с помощью 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.042 c
9-1082198740
ArchangelM
2004-04-17 14:45
2004.08.01
Запутался совсем...


3-1089030444
ligor
2004-07-05 16:27
2004.08.01
SQL-расширения IB 1.5


14-1089887417
vecna
2004-07-15 14:30
2004.08.01
Расшифровка протеста


14-1089717657
Ega23
2004-07-13 15:20
2004.08.01
Нуль-модем: отладка драйвера


1-1089894224
ydv
2004-07-15 16:23
2004.08.01
ООП





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский