Я уже отвечал на подобный вопрос. Эту колдунью зовут Кодировка КОИ-8. Таблица кодирования: А-Ю, Б-А, В-Б, Г-Ц, Д-Д, Е-Е, Ж-Ф, З-Г, И-Х, Й-И, К-Й, Л-К, М-Л, Н-М, О-Н, П-О, Р-П, С-Я, Т-Р, У-С, Ф-Т, Х-У, Ц-Ж, Ч-В, Ш-Ь, Щ-Ы, Ъ-З, Ы-Ш, Ь-Э, Э-Щ, Ю-Ч, Я-Ъ, Ё-╦ Таблица построена так. Слева стоят буквы по русскому алфавиту, а справа русские буквы, соответствующие английскому алфавиту. @ - Ю (код 40), A - А (41), B - Б, C - Ц, D - Д, E - E, F - Ф, и т.д. Буква Ё - 33-ья в алфавите, она выбивается из ряда в 32 буквы, поэтому превращается не в букву, а в элемент псевдографики. И еще меняется регистр, 1-ая буква маленькая, остальные большие. Эти имена по порядку: Глеб, Степан, Иван, Фёдор, Кирилл, Леонид
// PascalABC.NET 3.1, сборка 1204 от 24.03.2016 begin var F,G:file of integer; Assign(F,'FFile.dat'); Rewrite(F); for var i:=1 to 30 do Write(F,Random(-20,20)); // Файл F создан и заполнен Assign(G,'GFile.dat'); Rewrite(G); F.Seek(0); var e:integer; Print('F:'); while not F.Eof do begin Read(F,e); Print(e); if e>0 then Write(G,e) end; F.Seek(0); while not F.Eof do begin Read(F,e); if e<0 then Write(G,e) end; F.Seek(0); while not F.Eof do begin Read(F,e); if e=0 then Write(G,e) end; F.Close; Writeln; Print('G:'); G.Seek(0); while not G.Eof do begin Read(G,e); Print(e) end; G.Close end.
Данное решение неоптимально по времени, поскольку файл читается трижды. Можно сделать иной вариант, читая данные за один проход и помещая в две вс структуры памяти отрицательные и нулевые элементы.
// PascalABC.NET 3.1, сборка 1204 от 24.03.2016 begin var F,G:file of integer; Assign(F,'FFile.dat'); Rewrite(F); for var i:=1 to 30 do Write(F,Random(-20,20)); // Файл F создан и заполнен Assign(G,'GFile.dat'); Rewrite(G); var n:=F.FileSize; var neg,zer:array of integer; SetLength(neg,n); SetLength(zer,n); F.Seek(0); var e:integer; var ineg:=0; var izer:=0; Print('F:'); while not F.Eof do begin Read(F,e); Print(e); if e>0 then Write(G,e) else if e<0 then begin neg[ineg]:=e; Inc(ineg) end else begin zer[izer]:=e; Inc(izer) end end; F.Close; Writeln; SetLength(neg,ineg); foreach e in neg do Write(G,e); SetLength(zer,izer); foreach e in zer do Write(G,e); Print('G:'); G.Seek(0); while not G.Eof do begin Read(G,e); Print(e) end; G.Close end.