|
Вопрос # 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 - без труда переделаете под свои нужды
Приложение: Переключить в обычный режим- type tp = packed record st : ShortString; vl : real end;
- procedure TForm1.Button1Click(Sender: TObject);
- var fhandle, i : integer;
- s : tp;
- begin
- fhandle := FileOpen('my.dat', fmOpenWrite OR fm);
-
-
- fhandle := FileCreate('my.dat');
- FileClose(fhandle);
- fhandle := FileOpen('my.dat', fmOpenWrite);
- if fhandle = -1 then exit;
- end;
-
-
- for i := 0 to 30 do
- begin
- s.st := 'some str #' + intTOStr(i);
- s.vl := i / 343;
- FileWrite(fhandle, s, SIZEOF(tp))
- end;
- FileClose(fhandle);
- end;
-
- procedure TForm1.Button2Click(Sender: TObject);
- var
- fhandle, i, fileLen : integer;
- s : tp;
- begin
- fhandle := fileOpen('my.dat', fmOpenRead);
-
- fileLen := FileSeek(fhandle, 0, 2);
- fileSeek(fhandle, 0, 0);
- if filelen mod sizeof(tp) > 0 then
-
-
- fileClose(fhandle);
- showmessage('Error');
- end;
- for i := 1 to filelen div sizeof(tp) do
- begin
- fileread(fhandle, s, sizeof(tp));
- showmessage(s.st + ' ' + FloatToStr(s.vl))
- end;
- FileClose(fhandle);
- end;
-
 |
Ответ отправил: mvp (статус: 4-ый класс)
Время отправки: 23 января 2007, 20:11
Оценка за ответ: 4
|
Мини-форум вопроса
Всего сообщений: 5; последнее сообщение — 24 января 2007, 11:58; участников в обсуждении: 2.
|
Виталий Лещенко (статус: 4-ый класс), 23 января 2007, 20:12 [#1]:
тогда ошибка в 14 строке...
код в студию!
|
|
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 (статус: 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');
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|