![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запись/чтение файла с помощью 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'ов быть не может ?