Страница 1 из 1
[Pascal] Требуется помощь. Изменение одного элемента в каждой записи всего файла.
Добавлено: 04 мар 2008, 19:12
vlaad
Есть файл раннее созданный так же программкой на паскале, вот с такими элементами
Код: Выделить всё
type inf=record
imya:string[15];
familiya:string[15];
dolzhnost:string[20];
zarplata:real;
end;
var
F: file of inf;
Data: inf;
.....
По заданию мне нужно увеличить зарплату на 5% и перезаписать файл с новыми значениями на месте "zarplata". Пробывал чего-то сделать, но получалось так, что вместо всех записей записывало одного человека (последнего из списка) и разные значения "зарплата" или записывало только значения зарплат и в итоге ничего не получилось.
Re: [Pascal] Требуется помощь. Изменение одного элемента в каждой записи всего файла
Добавлено: 04 мар 2008, 20:33
Serge_Bliznykov
Ваша ошибка в том, что не рекомендуется и читать и писать в один и тот же файл.
А если так делать, то использовать совсем другие методы доступа к файлу!
Вот, пишу прямо на коленке (в броузере), поэтому ошибки подправить самостоятельно...
Код: Выделить всё
type inf=record
imya:string[15];
familiya:string[15];
dolzhnost:string[20];
zarplata:real;
end;
var
F,F2: file of inf;
Data: inf;
begin
Assign(F, 'ФайлДанн.dat');
Reset(F);
Assign(F2, 'Temp$$$.dat'); {временный файл, куда будем писать новое}
Rewrite(F2);
while Not Eof(F) do begin
Read(F,Data);
Data.zarplata := Data.zarplata * 1.05;
Write(F2,Data)
end;
close(F);
Close(F2);
Erase(F);
Rename(F2,'ФайлДанн.dat');
end.
.
Добавлено: 05 мар 2008, 10:33
BBB
Serge_Bliznykov писал(а):Ваша ошибка в том, что не рекомендуется и читать и писать в один и тот же файл.
Это почему же?
Открываешь бинарный (не текстовый) существующий файл через Reset, и можно и писать и читать.
Re: [Pascal] Требуется помощь. Изменение одного элемента в каждой записи всего файла
Добавлено: 05 мар 2008, 21:04
Serge_Bliznykov
BBB, Вы правы. Почему то я решил, что для типизированных это не так.
тогда код можно переписать так:
Код: Выделить всё
type inf=record
imya:string[15];
familiya:string[15];
dolzhnost:string[20];
zarplata:real;
end;
var
F : file of inf;
Data: inf;
i : integer;
begin
Assign(F, 'ФайлДанн.dat');
Reset(F);
i := 0;
while Not Eof(F) do begin
Read(F,Data);
Data.zarplata := Data.zarplata * 1.05;
seek(F,i);
inc(i);
Write(F,Data)
end;
WriteLn('Обработали ',i:1,' записей.');
close(F);
end.
Re: [Pascal] Требуется помощь. Изменение одного элемента в каждой записи всего файла
Добавлено: 05 мар 2008, 21:06
Serge_Bliznykov
ещё добавлю в своё оправдание ;-)
К слову. я же написал - "не рекомендуется", а не "НЕЛЬЗЯ"... 8-))
и первый мой пример кода тоже был рабочий...
Re: [Pascal] Требуется помощь. Изменение одного элемента в каждой записи всего файла
Добавлено: 06 мар 2008, 11:28
BBB
Serge_Bliznykov,
В принципе, позицию для Seek можно получать, используя FilePos перед операцией чтения, а не считая счетчик i. Хотя ошибки в данном алгоритме нет.