Другие языки программирования и технологии
Задача на ПаскалеИмеется текстовый файл. Переписать его строки в обратном порядке в другой файл
Очень надо
Доброго времени суток.
Немного не понятно, что имел в виду автор вопроса, говоря "Переписать его строки в обратном порядке в другой файл"? Меняется порядок строк в файле или символов в строках?
Тема символов в строках, в принципе, раскрыта Johnny_Viper и интереса не представляет. Решение, предложенное Наталья, предполагает использование массива, а для его объявления нужно знать число строк в файле. Учтитывая, что размер переменной String по-умолчанию равен 255 символов, в сегменте данных программы можно разместить массив из 255 элементов. Ну а как файл больше строк будет содержать? Выход в использовании динамических структур или непосредственной работой с файлом. Предлагаю именно такой вариантик решения. Не идеальный и медленный, но рабочий для любого размера файла.
program Tst;
{возвращает число строк в текстовом файле}
function StrCount(var F: Text): Longint;
var
n : Longint;
S : String;
begin
Reset(F);
n := 0;
while not Eof(F) do begin
ReadLn(F, S);
Inc(n);
end;
StrCount := n;
end;
{читает строку с номером N из текстового файла}
function ReadString(var F: Text; N: Longint): String;
var
i : Longint;
S : String;
begin
Reset(F);
i := 0;
while not Eof(F) and (i < N) do begin
ReadLn(F, S);
Inc(i);
end;
ReadString := S;
end;
var
F, F1 : Text;
i : Longint;
S : String;
begin
Assign(F1, 'FileIn.txt');
Reset(F1);
Assign(F2, 'FileOut.txt');
Rewrite(F2);
for i:=StrCount(F1) downto 1 do WriteLn(F2, ReadString(F1, i));
Close(F1);
Close(F2);
end.
Удачи!
Немного не понятно, что имел в виду автор вопроса, говоря "Переписать его строки в обратном порядке в другой файл"? Меняется порядок строк в файле или символов в строках?
Тема символов в строках, в принципе, раскрыта Johnny_Viper и интереса не представляет. Решение, предложенное Наталья, предполагает использование массива, а для его объявления нужно знать число строк в файле. Учтитывая, что размер переменной String по-умолчанию равен 255 символов, в сегменте данных программы можно разместить массив из 255 элементов. Ну а как файл больше строк будет содержать? Выход в использовании динамических структур или непосредственной работой с файлом. Предлагаю именно такой вариантик решения. Не идеальный и медленный, но рабочий для любого размера файла.
program Tst;
{возвращает число строк в текстовом файле}
function StrCount(var F: Text): Longint;
var
n : Longint;
S : String;
begin
Reset(F);
n := 0;
while not Eof(F) do begin
ReadLn(F, S);
Inc(n);
end;
StrCount := n;
end;
{читает строку с номером N из текстового файла}
function ReadString(var F: Text; N: Longint): String;
var
i : Longint;
S : String;
begin
Reset(F);
i := 0;
while not Eof(F) and (i < N) do begin
ReadLn(F, S);
Inc(i);
end;
ReadString := S;
end;
var
F, F1 : Text;
i : Longint;
S : String;
begin
Assign(F1, 'FileIn.txt');
Reset(F1);
Assign(F2, 'FileOut.txt');
Rewrite(F2);
for i:=StrCount(F1) downto 1 do WriteLn(F2, ReadString(F1, i));
Close(F1);
Close(F2);
end.
Удачи!
Const
nmax=10;
Var
f1,f2:text;
st:array[1..nmax] Of string;
i,n:Integer;
Begin
Assign(f1,'a.txt');
Assign(f2,'b.txt');
Reset(f1);
Rewrite(f2);
n:=0;
While Not EOF(f1) Do
Begin
n:=n+1;
ReadLn(f1,st[n])
End;
For i:=n DownTo 1 Do
Writeln(f2,Sti]);
Close(f1);
Close(f2)
End.
nmax=10;
Var
f1,f2:text;
st:array[1..nmax] Of string;
i,n:Integer;
Begin
Assign(f1,'a.txt');
Assign(f2,'b.txt');
Reset(f1);
Rewrite(f2);
n:=0;
While Not EOF(f1) Do
Begin
n:=n+1;
ReadLn(f1,st[n])
End;
For i:=n DownTo 1 Do
Writeln(f2,Sti]);
Close(f1);
Close(f2)
End.
procedure reverse(s:string);
begin
if not(eof) then
begin
readln (s);
reverse(s);
writeln (s);
end;
end;
begin
assign (input,'d:\input.txt'); reset (input);
assign(output,'d:\output.txt'); rewrite (output);
reverse('');
end.
Есть небольшое ограничение на длину файла, для разных компиляторов разное. Но в любом случае больше чем заранее приготовленный массив.
Еще 1 вариант, для гурманов:
uses crt;
var f:file of char;
g:text;
s:string;
c:char;
i:longint;
begin
assign (g,'d:\output.txt'); rewrite(g);
assign (f,'d:\input.txt'); reset (f);
for i:=filesize (f)-1 downto 0 do begin
seek (f,i); read (f,c);
if byte (c)=10 then begin
writeln (g,s); s:='';
end
else begin
if byte (c)>13 then s:=c+s;
end;
end;
if length(s)>0 then writeln (g,s);
close (f); close (g);
end.
Чтение как и в первом случае каждой строки производится единожды. Ограничений на размер файла нет.
begin
if not(eof) then
begin
readln (s);
reverse(s);
writeln (s);
end;
end;
begin
assign (input,'d:\input.txt'); reset (input);
assign(output,'d:\output.txt'); rewrite (output);
reverse('');
end.
Есть небольшое ограничение на длину файла, для разных компиляторов разное. Но в любом случае больше чем заранее приготовленный массив.
Еще 1 вариант, для гурманов:
uses crt;
var f:file of char;
g:text;
s:string;
c:char;
i:longint;
begin
assign (g,'d:\output.txt'); rewrite(g);
assign (f,'d:\input.txt'); reset (f);
for i:=filesize (f)-1 downto 0 do begin
seek (f,i); read (f,c);
if byte (c)=10 then begin
writeln (g,s); s:='';
end
else begin
if byte (c)>13 then s:=c+s;
end;
end;
if length(s)>0 then writeln (g,s);
close (f); close (g);
end.
Чтение как и в первом случае каждой строки производится единожды. Ограничений на размер файла нет.
Суть алгоритма:
Создаешь две переменные типа String и одну i:integer, потом проверяешь длину функцией i:=length(стр_переменная) (функция length возвращает числом количество символов в тексте) , делаешь цикл while .. downto это цикл который считает обратно от целочисленной переменной i до 0 т. е. до начала. В теле цикла делаешь запись что то типа: ко второй текстовой переменной каждый раз прибавить символ который находиться в цикле от конца текста. Потом сохраняешь в файл. Если что не понятно пиши.
Создаешь две переменные типа String и одну i:integer, потом проверяешь длину функцией i:=length(стр_переменная) (функция length возвращает числом количество символов в тексте) , делаешь цикл while .. downto это цикл который считает обратно от целочисленной переменной i до 0 т. е. до начала. В теле цикла делаешь запись что то типа: ко второй текстовой переменной каждый раз прибавить символ который находиться в цикле от конца текста. Потом сохраняешь в файл. Если что не понятно пиши.
Похожие вопросы
- Assembler: вывод через текстовый файл.
- Excel. Строки в столбце поставить в обратном порядке
- Открывается текстовый файл но не записывается - C++
- Скопировать из текстового файла .txt часть строк c 1 по 3000, затем с 3000 по 6000 и так до конца файла.
- Преобразуйте строку так, чтобы сначала в ней шли буквы, но в обратном порядке, а затем цифры в прямом. Напишите кодна С#
- Какими текстовыми редакторами можно полноценно открыть 11 гигабайтный текстовый файл?
- задача TurboPascal с текстовым файлом, помогите....
- Как из pdf можно сделать какой-нибудь текстовый файл?
- Как переделать jpg в текстовый файл??
- Как прочитать огромный текстовый файл в PChar на Delphi и разобрать на предложения и слова???