Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 281

/ вопрос открыт /

Пишу дополнение к вопросу №280, автором которого являюсь я же. Решил разобраться как же записывать этот файл *.dat. Связал переменную ff с физич.файлом, записал в него массив mas, никаких ошибок программа не выдала, всё записалось очень гладко, а когда начал считывать, то он не отображался в диалоге открытия, т.к. стоял фильтр на *.dat, тогда я к имени добавил расширение AssignFile(ff,'Список.dat'); Сохранилось снова прекрасно, а при чтении массива mas из этого файла программа выдаёт ошибку I/O error 103 или Project Proiect2.exe raided exception class EInOutError with message 'I/O error 103'. Process stopped. Use Step or Run to continue. Ответьте пожалуйста, как правильно записывать и считывать файл. С уважением, Сергей Анатольевич.

Полушин Сергей Анатольевич Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Полушин Сергей Анатольевич (статус: Посетитель)
Вопрос отправлен: 23 января 2007, 18:35
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Виталий Лещенко

Здравствуйте, Полушин Сергей Анатольевич!

1. Если необходимо открыть текстовый файл для чтения, то надо писать:
assignfile(ffile, 'name');
reset(ffile); // <- это важно!!!!

2. Если необходимо открыть текстовый файл для записи, то надо писать:
assignfile(ffile, 'name');
rewrite(ffile); // <- это важно!!!!

3. Если необходимо открыть текстовый файл для дозаписи, то надо писать:
assignfile(ffile, 'name');
append(ffile); // <- это важно!!!!

PS:
Не забывай закрывать файлы.
closefile(ffile);

Ответ отправил: Виталий Лещенко (статус: 4-ый класс)
Время отправки: 23 января 2007, 19:19
Оценка за ответ: 1

Комментарий к оценке: мне нужно открыть файл *.dat

Ответ #2. Отвечает эксперт: mvp

Смотрите приложение (две кнопки на форме - обработчик button1 - создаёт типизированный файл, а button2 - читает). Сразу замечу, что record нужно объявлять со словом packed, т. к., если без него, то размер записи будет больше фактической из-за того, что среда будет выравнивать елементы записи по словам, например. Так что, если хотим файл по-меньше, то ставим packed. Во всех файловых ф-ях ещё можно дописать or fmShareDenyNone, чтобы файлы ещё кто-то мог смотреть во время выполнения.
Если используется строка, то должно быть описано именно ShortString, т. к. все другие строки - скрытые указатели и процедуру записи и чтения нужно будет менять.

Пример абстрактный, если хоть немного знакомы с delphi - без труда переделаете под свои нужды

Приложение:
  1. type tp = packed record st : ShortString; vl : real end;
  2. procedure TForm1.Button1Click(Sender: TObject);
  3. var fhandle, i : integer;
  4. s : tp;
  5. begin
  6. fhandle := FileOpen('my.dat', fmOpenWrite OR fm);
  7.  
  8.  
  9. fhandle := FileCreate('my.dat');
  10. FileClose(fhandle);
  11. fhandle := FileOpen('my.dat', fmOpenWrite);
  12. if fhandle = -1 then exit;
  13. end;
  14.  
  15.  
  16. for i := 0 to 30 do
  17. begin
  18. s.st := 'some str #' + intTOStr(i);
  19. s.vl := i / 343;
  20. FileWrite(fhandle, s, SIZEOF(tp))
  21. end;
  22. FileClose(fhandle);
  23. end;
  24.  
  25. procedure TForm1.Button2Click(Sender: TObject);
  26. var
  27. fhandle, i, fileLen : integer;
  28. s : tp;
  29. begin
  30. fhandle := fileOpen('my.dat', fmOpenRead);
  31.  
  32. fileLen := FileSeek(fhandle, 0, 2);
  33. fileSeek(fhandle, 0, 0);
  34. if filelen mod sizeof(tp) > 0 then
  35.  
  36.  
  37. fileClose(fhandle);
  38. showmessage('Error');
  39. end;
  40. for i := 1 to filelen div sizeof(tp) do
  41. begin
  42. fileread(fhandle, s, sizeof(tp));
  43. showmessage(s.st + ' ' + FloatToStr(s.vl))
  44. end;
  45. FileClose(fhandle);
  46. end;
  47.  


Ответ отправил: mvp (статус: 4-ый класс)
Время отправки: 23 января 2007, 20:11
Оценка за ответ: 4


Мини-форум вопроса

Всего сообщений: 5; последнее сообщение — 24 января 2007, 11:58; участников в обсуждении: 2.
Виталий Лещенко

Виталий Лещенко (статус: 4-ый класс), 23 января 2007, 20:12 [#1]:

тогда ошибка в 14 строке...
код в студию!
mvp

mvp (статус: 4-ый класс), 23 января 2007, 20:29 [#2]:

2 Виталий Лещенко: это Вы мне? Где ошибка?
Хотя да, вижу строку fhandle := FileOpen('my.dat', fmOpenWrite OR fm);
естественно, надо fhandle := FileOpen('my.dat', fmOpenWrite);
или fhandle := FileOpen('my.dat', fmOpenWrite or fmShareDenyNone);
mvp

mvp (статус: 4-ый класс), 23 января 2007, 20:32 [#3]:

2 Виталий Лещенко: судя по времени сообщения - это таки не мне :)
Виталий Лещенко

Виталий Лещенко (статус: 4-ый класс), 24 января 2007, 11:57 [#4]:

2 mvp: да, мое пред. сообщение для автора вопроса...
Виталий Лещенко

Виталий Лещенко (статус: 4-ый класс), 24 января 2007, 11:58 [#5]:

>> Комментарий: мне нужно открыть файл *.dat
Ну тогда assignfile(ffile, 'filename.dat');

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:41
Выполнено за 0.02 сек.