Форум «Всё о Паскале» _ Задачи _ Список построенный из элементов файла
Автор: AlexSun 26.11.2011 19:57
Задание:
Цитата
type TE = <любой_тип>; ff = file of TE; список =^ звено; звено = record элемент: TE; следующий: список; end; Описать функцию, значением которой есть список, построенный из элементов файла.
Моя программа:
uses crt; type TE = char; ff = file of TE; list =^ link; link = record element: TE; next: list; end; var fname: string[79]; f: ff; ch: TE; l: list;
function flist(var f: ff): list; var l, p, q: list; x: TE; begin new(l); read(f,x); l^.element := x; p := l; while not eof(f) do begin read(f,x); new(q); q^.element := x; p^.next := q; p := q end; p^.next := nil; flist := l end;
begin clrscr; write('Введите имя файла: '); readln(fname); assign(f,fname); {I-} reset(f); {I+} if IOResult <> 0 then begin writeln('Введите текст:'); rewrite(f); repeat read(ch); write(f,ch) until ch = #10; close(f); reset(f) end; l := flist(f); writeln('Элементы списка:'); while l <> nil do begin write(l^.element); l := l^.next end; readkey end.
Как переделать функцию flist, чтоб не вылетала с ошибкой при пустом файле?
И еще вопрос, как лучше сделать ввод элементов списка. При until ch = #10 в конец записывается символ \n, при until ch = #13 - \r, а они мне не нужны. Или сделать тип элемента списка integer что ли, да вводить в цикле for, перед этим получив их количество...
Автор: IUnknown 26.11.2011 20:23
Цитата
Как переделать функцию flist, чтоб не вылетала с ошибкой при пустом файле?
Тысячу раз говорено: не делайте разницы между первым и остальным элементами списка - потом не придется править вот такие огрехи!!! Первый элемент списка ничем не примечателен, он ТОЧНО такой же, как и второй, и как третий, и как последний. Почему третий элемент вводится в основном цикле, а первый - нет? Не надо разделять, "первый"/"не первый":
function flist(var f: ff): list; var l, p, q: list; x: TE; begin l := nil; while not eof(f) do begin read(f, x); new(q); q^.element := x; q^.next := nil; if l = nil then l := q else p^.next := q; p := q; end; flist := l end;
Цитата
Или сделать тип элемента списка integer что ли, да вводить в цикле for, перед этим получив их количество...
Или сделать тип файла Text, и читать из него целочисленные данные обычным Read(f, int_var);
Автор: AlexSun 26.11.2011 20:48
Цитата(IUnknown @ 26.11.2011 15:23)
Или сделать тип файла Text, и читать из него целочисленные данные обычным Read(f, int_var);
Я имел ввиду этот кусочек кода:
repeat read(ch); write(f,ch) until ch = #10;
При создании файла. Файл обязательно типизированный (но его тип любой, я выбрал char). В общем, until ch = '.' будет, точка признак конца текста.
Нужно ли память освобождать в конце работы? Как?
Автор: AlexSun 27.11.2011 2:25
Освобождение памяти:
procedure dlist(l: list); var t: list; begin while l <> nil do begin t := l^.next; dispose(l); l := t; end end;