Главная страница
    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.51 MB
Время: 0.034 c
3-1089292205
Sectey
2004-07-08 17:10
2004.08.01
Почему не удаетмя открыть таблицу MS-SQL?


1-1089977459
borow
2004-07-16 15:30
2004.08.01
Проблема с quickrep


1-1090392857
Дмитрий 2004
2004-07-21 10:54
2004.08.01
как в Image можно очистить рисунок


8-1084811635
killer
2004-05-17 20:33
2004.08.01
Подскажите как в Jpg-фотографию вставить exe-файл?


1-1090326277
ИМХО
2004-07-20 16:24
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский