| 
| 
 | Вопрос # 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');
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |