Форум: "Основная";
Текущий архив: 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.044 c