![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли ВООБЩЕ данный участок кода сделать проще: без copy, val?
Евгений2 © (2004-12-29 02:39:00)Программа берет из файла base все записи поочереди, причём файл имеет сл. структуру:
ФИО автора книги Название книги год издания
Нужно записать в файл (Newbase) список авторов издававшихся до 1980 года....
Вопрос в следующем... Можно ли проделать те же действия только без copy или val или хотя бы чего-нибудь одного.
Вся трудность в том, что год издания в конце строки, причём год записан так "1984г"
Вот листинг, написанный на Turbo Pascal
const
A='base.txt'
B='Newbase.txt'
Var F, F1: text;
St, X: String;
I,Y,S: integer;
begin
Assign(F,A);
Reset(F);
Assign(F1,B);
Reset(F1);
Rewrite(F1);
while not Eof(F) DO
begin
Readln(F,St);
X:=copy(St, length(St)-4,4); //COPY
Val(X,Y,I); //VAL
if Y<1980 then
Writeln(F1,St);
end;
Close(F);
Close(F1);
end.
Если есть какие-либо мысли? Прошу написать!
Большое вам спасибо!
begin...end (2004-12-29 14:48:00) [1]> [8] TButton © (29.12.04 10:40)
Объясняюсь. Я опечатался - имел в виду типизированный файл, а именно файл записей.
Запись бы была, например, такая:
type
TBookInfo = packed record
FIO: String [40];
Title: String [40];
Year: Word
end.
Тогда можно было бы использовать файл типа file of TBookInfo, и записывать/читать в/из него целыми записями с помощью процедур Writeи Read. Недостатки такого способа налицо: во-первых, получающийся файл тяжело редактировать вручную (в отличие от текстового), а во-вторых, приходится пользоваться короткой строкой (String [40], например), вся длина которой может и не понадобиться.
Можно, конечно, использовать и нетипизированные файлы, и писАть в них даже длинные строки, и вообще всё что угодно, по схеме: сначала записываем длину "чего угодно", потом - непосредственно "что угодно". Но так гораздо тяжелее. Например, я не знаю другого способа сохранения длинных строк в нетипизированный файл, кроме такого:
var
F: file;
S: String;
begin
...
BlockWrite(F, (@S[1])^, Length(S))
...
end.
Евгений2 (2004-12-29 14:04:00) [2]=))))) Спасибо всем!
2TUser
Мне очень даже понравились, толкьо вот препод.... ;) козлит =))...
TUser (2004-12-29 11:25:00) [3]А чем не понравились copy и val?
TButton (2004-12-29 10:40:00) [4]
> Если файлы не предназначены для ручного редактирования,
> то я бы воспользовался всё же нетипизированными файлами.
> Тогда бы не понадобились ни Val, ни Copy.
объяснитесь.
begin...end (2004-12-29 09:02:00) [5]> Евгений2 (29.12.04 02:39)
Если файлы не предназначены для ручного редактирования, то я бы воспользовался всё же нетипизированными файлами. Тогда бы не понадобились ни Val, ни Copy.
TButton (2004-12-29 03:59:00) [6]
> потому что тысячелетие наверняка смысла нет смотреть) и
> сравнить через тот же "<"
а как же труды Платона? =)
default (2004-12-29 03:42:00) [7]TButton © (29.12.04 03:27) [4]
похоже, только сравнение нужно улучшить и подправить
можно попробовать ввести какой-нибудь тип
TStr3 = Array[1..3] of Char;
и сделать приведение(3 символа потому что тысячелетие наверняка смысла нет смотреть) и сравнить через тот же "<"
TButton (2004-12-29 03:27:00) [8]
l:=length(st)-4;
if (st[l]<='1')and(st[l+1]<='9')and(st[l+2]<='8')and(st[l+3]<'0')
так?
default (2004-12-29 03:24:00) [9]TButton © (29.12.04 03:09) [2]
"а без COPY тебе не обойтись"
ну почему же, строка же есть, можно просто по цифрам сравнивать
TButton (2004-12-29 03:09:00) [10]а без COPY тебе не обойтись, раз уж все в одну строку пишется
можно разбить (в блокноте) строку на три т.е. было
ФИО автора книги Название книги год издания
стало
ФИО автора книги
Название книги
год издания
тогда код меняется следующим образом
A='base.txt'
B='Newbase.txt'
Var F, F1: text;
auth, title, year, X: String;
I,Y,S: integer;
begin
Assign(F,A);
Reset(F);
Assign(F1,B);
Reset(F1);
Rewrite(F1);
while not Eof(F) DO
begin
Readln(F,auth);
Readln(F,title);
Readln(F,year);
if year<'1980' then
begin
Writeln(F1,auth);
Writeln(F1,title);
Writeln(F1,year);
// или вот так
// Writeln(F1,auth+' '+title+' '+year+'г');
end;
end;
Close(F);
Close(F1);
end.
TButton (2004-12-29 03:01:00) [11]
A='base.txt'
B='Newbase.txt'
Var F, F1: text;
St, X: String;
I,Y,S: integer;
begin
Assign(F,A);
Reset(F);
Assign(F1,B);
Reset(F1);
Rewrite(F1);
while not Eof(F) DO
begin
Readln(F,St);
X:=copy(St, length(St)-4,4); //COPY
if X<'1980' then
Writeln(F1,St);
end;
Close(F);
Close(F1);
end.