В общем задача: Дан файл, компоненты которого целые числа. Нужно из етого файла извлечь последнюю и записать в новый файл!
задача очень легкая, но решить ее не смог. Пробовал вот так:
Program p_1(s,f); uses crt; Var s,f:text; a,k:integer; Begin Clrscr; assign(S,'f1.txt'); assign(f,'f2.txt'); Reset(s); Rewrite(f); Append(F); While not eof(s) do Begin Inc(k); End; Writeln(F,k); Close(S); Close(f); Readln; End.
Сообщение отредактировал Fedoroff - Вторник, 29.01.2008, 06:56
Program Files; Uses CRT; Const f1 = 'file1.dat'; f2 = 'file2.dat'; Var f: file of Integer; i: Integer; s: Integer; Begin ClrScr; Randomize; Assign(f, f1); ReWrite(f); Write('Fail soderjit: '); For i := 1 to 10 do Begin s := Random(10) + 1; Write(f, s); Write(s, ' '); End; Seek(f, FileSize(f)-1); Read(f, s); Close(f); Assign(f, f2); ReWrite(f); Write(f, s); Writeln(#13#10,'Posledniy element ',s,' pomeshen v dr. fail'); Close(f); Readkey; End.
Во-первых, эти файлы текстовые. В них компоненты - чары. Надо было: f: file of integer; Во-вторых,
Quote (Fedoroff)
Writeln(F,k);
, не понятно для чего это сделано? Надо Seek(f, k - 1); а то что ты написал запишет СТРОКУ из переменной k в файл F. Короч, Seqular тебе щас код скинет.
Fedoroff, Seek - смещает позицию файла f на компонент k-1. Ну ты исходный код видишь, там смещаемся на позицию Filesize(f)-1, т.е. на последний элемент!
А еще
Quote
компоненты которого целые числа
- это означает, что файл типизированый! т.е. если полностью выполнить условие задачи - нужно использовать file of integer.
Кроме того, seek и filesize работают с типизированными файлами.
А так как в условии ничего не сказано про одновременную работу с файлами, как с текстом, и во избежании ошибок - правильней все-таки будет использовать типизированный файл.
Можешь открыть эти файлы любым 16-ричным редактором и убедится в том, что прога работает как надо... (прим число 0х0A = 10)
Ага. Кстати, если в школе не проходили, это не значит что не надо этого знать. Можно конечно текст, но как сказано было в условиях, так и сделали. Или надо именно с текстом? На мой взгляд использование текстовых файлов для работы с числами только усложнит работу. Представь, если числа будут отрицательными? Они ведь тоже целые. Как ты их будешь считывать? Можно, но сложно. А у типизированных файлов есть такая фишка как позиция, или указатель в файле. Так что печатай seek и потом по нему поиск, все просто, там увидишь и остальные операции с файлами.
Так что у меня получилось: Вот как я по-новому задвчу написал Program p_1(s,f); uses CRT; Var s,f:file of integer; a:integer; Begin ClrScr; Assign(s,'ish.txt') дело в том, что у меня уже есть файлы и их не надо заполнять случайным образом Seek(s,filesize(s)-1); Read(s,a); Close(s); Assign(f,'pol.txt'); Rewrite(f); Write(f,a); Close(f); Readkey; End.
Так вот если, например, у меня в файле ish.txt записаны такие числа:1 2 3 4 5, то он записывает в файл pol.txt цифру 4.... Я подумал это из-за того что я писал Seek(s,filesize(s)-1) и попробовал поменять на Seek(s,filesize(s)); но у меня выдалась ошибка №100 Dick read error. Не подскажите почему? и как мне исправить?
Добавлено (31.01.2008, 23:15) --------------------------------------------- Все решил я задачу но намного проще: ... ClrScr; assign(s,'123.txt'); assign(f,'321.txt'); reset(s); append(f); While not eof(s) do Begin Read(s,a); end; Write(f,a); Close(s); Close(f); Readln; End.
Fedoroff, Seek работает с типизированными файлами! А у тебя текстовый, нужно использовать именно типизированный (по условию задачи).
А твое решение:
Code
While not eof(s) do Begin Read(s,a); end;
неоптимально. Представь, что в файле 1000 символов.... Этот код будет 1000 раз брать из файла по символу и заносить в память... ничего с ними не делая....
А первый код с txt у тебя не работал потому что - тебе нельзя создавать файл в блокноте и т.д.... Потому что там ты создаешь текстовый файл (перевод строки - Ascii13-10), и каждый компонент - 1 байт занимает... А
Quote (Fedoroff)
Дан файл, компоненты которого целые числа
целое число - Integer - занимает 2 байта...
Чтобы проверить, решил ты задачу или нет: - занеси в файл последним отрицательное число... И увидишь, что оно магическим образом стало ПОЛОЖИТЕЛЬНЫМ, потому что знак "-" считался отдельно от самого числа и был пропущен.... Понимаешь?
Disk read error # 100 - эта ошибка называется хер пойми! На самом деле. Кажется, что все лады, но не все. Еще раз перекомпиль и все, может получится. И еще, типизированные файл ты в блокноте вряд ли сделаешь. По крайней мере у меня не получалось. А то что тебе Seqular сказал правильно. Надо правильно делать, особенно с файлами.