There is no such thing as a stupid question, until you ask it
Итак, теперь у меня проблемы с другой темой.
Задача: создать файл F и переписать в файл G нечетные строки.
Мой результат, который, несмотря на свою простоту и логичность (для меня, по крайней мере), крашится на одной строке, гррр:

Не понимаю, чем компилятору не понравился старый добрый эол. Ковырялась в окне отладки, но это не подсказало мне причину краша. Рассчитываю на вашу помощь, у меня уже правый глаз нервно подрагивает C:

@темы: Delphi

Комментарии
17.01.2013 в 08:55

тролль - это не только ценный жир, но и 3-4 легкоусвояемых коммента ежедневно
вот что говорит help:
After calling Rewrite, Eof(F) is always true.
17.01.2013 в 09:05

Птичка шизокрылая, Борец С Режимом Дня
0. У дельфы XE и выше есть команда Format Source. Это же умеет делать Pascal ABC и тот же paste.org.ru, который рекомендуют в шапке сообщества
1. Крашится она потому что у вас файл f открыт для записи, а вы из него читать хотите. Его надо закрыть и открыть по-другому.
2. Почему-то заработало окончательно, когда я забрала в комменты обычные readln, writeln. Не знаю, почему так, даааавно таким вводом-выводом не пользовалась
3. Заполнение строк: для заполнения строки одинаковыми символами есть функция FillChar.



uses
SysUtils;

var
f, g: text;
fname, gname, s, stplus, fst: string;
i, j, n, nlen: integer;

begin
fname:= 'F';
gname:= 'G';
assign (f, fname);
assign (g, gname);
rewrite (f);
randomize;
n:= 0;
for i:= 1 to random(10) + 5 do
begin
fst:= '';
inc (n);
str (n, stplus);
for j:= 1 to 8 do
fst:= fst + stplus;
writeln (f, fst);
// writeln(fst);
end;
close (f);
reset (f);
rewrite (g);
while not EOF (f) do { <=== ЭТА САМАЯ СТРОКА }
begin
Readln (f, s);
writeln (g, s);
// writeln (s);
end;
close (f);
close (g);
// Readln;
end.



И ышшо одно: такой ввод-вывод из файлов для винды считаются устаревшими. Работать-то они в основном будут, то куда эффективнее использование потокового ввода-вывода, а для списков строк есть вообще красивая штука TStringList.
17.01.2013 в 12:18

There is no such thing as a stupid question, until you ask it
Его надо закрыть и открыть по-другому.
:facepalm: Внимательность такая внимательность. Спасибо, все работает!
Почему-то заработало окончательно, когда я забрала в комменты обычные readln, writeln.
А у меня она работает и без этого. То есть, если оставить их в первоначальном варианте. :hmm:

А за функцию спасибо :3
18.01.2013 в 06:15

слеп
я конечно нифига не помню делфина, но меня смущает следующее:
у тебя в while каждый цикл происходит дважды считывание строк, а если строка осталась одна, это не может быть причиной?
18.01.2013 в 06:37

слеп
но это так, по алгоритму, сам язык я уже не помню
18.01.2013 в 06:52

There is no such thing as a stupid question, until you ask it
а если строка осталась одна, это не может быть причиной?
Считывание просто смещает указатель до конца строки. Если дальше гулять некуда - то он остается в самом конце. Если что, то выше предложенный вариант с исправлениями немного неверен: он не выполняет нужную в условии задачу. Но я его исправила, так что все оке! C;
И да, проблема была именно в закрытии файла. Все остальное верно.
18.01.2013 в 08:25

Птичка шизокрылая, Борец С Режимом Дня
GippoRex, я этого и не вписывала))) Видно же, что алгоритм вы можете реализовать и сами, а затык именно в открытии-закрытии, так что я просто внесла минимальное исправление
18.01.2013 в 13:40

There is no such thing as a stupid question, until you ask it
Neitent, а, меня просто смутило, что вы выложили всю прогу, я подумала, что ошибки где-то еще есть С:
Но все равно пламенное спасибо за помощь!