Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ чтение чисел из файла...

Автор: compiler 12.05.2007 23:14

Добрый день!
надо написать программу выполняющую чтение из текстового файла целых чисел и вывод на печать только четных чисел. собственно вот...

Var
f : text;
Put : string;
a : integer;
Begin
Put := 'D:\-stas\del\fi1.txt';
assign(f, Put);
reset(f);
while not Eof(f) do
begin
readln(f, a);
if not odd(a)
then
writeln(a);
end;
close(f);
readln
End.

теперь хотелось бы внести не большие изменения
1) можно ли вместо Полного пути к файлу использовать путь из текущей деректории?
2) можно ли обрабатывать не только первые числа в строке, а все...
по идее должно быть как-то так..
...
while not Eof(f) do
begin
while not eoln do
begin
readln(f, a);
if not odd(a)
then
writeln(a);
end;
end;
...

но ведь загвостка, как я понимаю в том что межну числами числами может быть разное количество отступов(а приведенная программа их вообще не обрабатывает) , может надо читать из файла строку пока не будет разделителя, а потом преабразововать в число?
помогите пожалуйста...

Автор: volvo 12.05.2007 23:49

Цитата
но ведь загвостка, как я понимаю в том что межну числами числами может быть разное количество отступов(а приведенная программа их вообще не обрабатывает)
А программа и не должна их обрабатывать... Это делает процедура Read... Если ты напишешь Read(f, a, b) и в файле f будут 2 числа, разделенные десятью пробелами, то они корректно прочитаются. Смотри (программа читает и печатает ВСЕ числа...):

var
f: text;
a: integer;

begin
assign(f, 'aa.txt'); reset(f);
while not seekeof(f) do begin
if seekeoln(f) then begin
readln(f); writeln;
end;
read(f, a); write(a:5);
end;
close(f);
end.


файл aa.txt лежит в той же папке, что и EXE, и содержит:
12      15
23 77 11
<пустая строка>

Автор: compiler 13.05.2007 19:25

Спасибо... если б еще коментарии... например разницу между seekeof и Eof...

Автор: volvo 13.05.2007 19:44

А разница - в том, что SeekEof (в отличии от Eof) видит конец файла "сквозь" все пробельные символы (пробелы, и табуляцию), и если от текущей позиции до конца файла остались только пробельные символы, то SeekEof вернет True (значащих для нее символов в файле больше нет), а Eof - вернет False, потому что хоть что-то еще можно прочесть.

Добавлено через 1 мин.
То же самое, кстати, справедливо и в отношении Eoln/SeekEoln, SeekEoln "не видит" пробельных символов...

Автор: compiler 13.05.2007 20:17

еще один вопрос...
а как переходить на деректорию(или несколько) вверх и проверять является ли текущая деректория корневой?

например если нам надо считать этот файл с корневого каталога текущего диска?

Автор: volvo 13.05.2007 20:29

var s: string;

getdir(0, s); { <--- Вот это... }

... вернет тебе текущую папку диска.

Хотя мне кажется, ты заходишь не с той стороны. Не проще было бы определишь текущий диск, и в его корневой папке открывать файл с заданным именем?

Автор: compiler 13.05.2007 20:35

Цитата(volvo @ 13.05.2007 16:29) *
Не проще было бы определишь текущий диск,

а если мы его не знаем?

и как создавать свою директорию?

Автор: volvo 13.05.2007 21:15

Цитата
а если мы его не знаем?
тогда делаем GetDir с первым параметром = 0 (как я показал), и смотрим на первый символ строки s.

Цитата
и как создавать свою директорию?
procedure MkDir(s: string);

Автор: compiler 13.05.2007 21:27

спасибо...