Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Файл в строку


Автор: Georg4 18.11.2003, 01:03
Мне нужно все строки текстовгог файла слить в одну. Я делаю:
while not eof(f) do
begin
readln(f,s);
s1:=s1+s;
richedit1.Lines.Add(s1);
Оно выдает весь процесс записи. Т.е. сначала одну строку, потом две потом 3 и так прибавляя по одной строке.
внимание,Ворос!
Что делать?

Автор: Vit 18.11.2003, 02:52
Код
Function ReadFileAsString(FileName:string; LeaveStringSeparators:boolean=True):string;
begin
 With TStringList.create do
   try
     LoadFromFile(FileName);
     Result:=text;
   finally
     Free;
   end;
 if not LeaveStringSeparators then
   begin
      Result:=StringReplace(Result, #13, '', [rfReplaceAll]);
      Result:=StringReplace(Result, #10, '', [rfReplaceAll]);
   end;
end;

Автор: Dmitry V.Abramov 18.11.2003, 03:53
Ой... Лучше без "тяжелой артиллерии" в виде TStringList. Он ведь при чтении из файла сначала добросовестно распарсит все CRLF и уберет их. Потом при GetText снова добросовестно приклеит CRLF к каждой строчке... IMHO, проще и шустрее было бы примерно так:
Код
Function ReadFileAsString(FileName:string; LeaveStringSeparators:boolean=True): string;
begin
 With TFileStream.Create(FileName, fmOpenRead) do try
   SetLength(Result, Size);
   if Result <> '' then Read(Result[1], Size);
 finally
   Free;
 end;

 if not LeaveStringSeparators then begin
   Result:=StringReplace(Result, #13, '', [rfReplaceAll]);
   Result:=StringReplace(Result, #10, '', [rfReplaceAll]);
 end;
end;

Автор: Paradox 18.11.2003, 07:10
А может так:
Код
while not eof(f) do
begin
readln(f,s);
s1:=s1+s;
end
richedit1.Lines.Add(s1);

Автор: Georg4 18.11.2003, 17:30
Цитата
А может так:CODE 
while not eof(f) do
begin
readln(f,s);
s1:=s1+s;
end
richedit1.Lines.Add(s1);

Это же то что я в начале сказал, это не получилась, а вункция Vit`a работает. Спасибо!

И ещё вопрос, хочу в этой строке убрать все пробелы, пишу:
for i:=0 to length(s) do
s1:= copy (s,1,i);
while s1 = ' ' do
delete (s,1,i);

Нифига!
как?

Автор: DonPager 18.11.2003, 20:01
Для пробелов вот
Код

i := 1;
S1 := '';
while i<= length(s)do
begin
 if S[i]<> ' ' then S1 := S1 + S[i];
 Inc(i);
end;

тоже подойдёт для выкидывания CRLF (S[i] <> #13)

Автор: Dmitry V.Abramov 18.11.2003, 20:27
Цитата(Georg4 @ 18.11.2003, 17:30)
Цитата
А может так:CODE 
while not eof(f) do
begin
readln(f,s);
s1:=s1+s;
end
richedit1.Lines.Add(s1);

Это же то что я в начале сказал, это не получилась,

Посмотри еще раз внимательно и найди одно отличие:
Код
while not eof(f) do
begin
 readln(f,s);
 s1:=s1+s;
 richedit1.Lines.Add(s1);

Код
while not eof(f) do
begin
 readln(f,s);
 s1:=s1+s;
end
richedit1.Lines.Add(s1);

Автор: Vit 18.11.2003, 21:52
Цитата(Georg4 @ 18.11.2003, 08:30)
пробелы, пишу:
for i:=0 to length(s) do
s1:= copy (s,1,i);
while s1 = ' ' do
delete (s,1,i); // - Ошибка здесь, надо delete (s1,1,i);

Нифига!
как?


Но так лучше:

Код
s1:=StringReplace(s,' ','',[rfReplaceAll]);

Автор: Vit 18.11.2003, 21:55
Цитата(Dmitry @ 17.11.2003, 18:53)
Ой... Лучше без "тяжелой артиллерии" в виде TStringList.

Спорить не буду, тем более что наиболее оптимальным было бы просто считывание файла в буффер, просто мне так удобнее, я привык и часто использую TStringList. Хотя конечно могу привести ещё штук 10 совершенно различных способов чтения файлов...

Автор: Vit 18.11.2003, 21:57
Цитата(Paradox @ 17.11.2003, 22:10)
А может так:
Код
while not eof(f) do
begin
readln(f,s);
s1:=s1+s;
end
richedit1.Lines.Add(s1);

По поводу этого и других вариантов с ReadLn - имеют ограничеснное применение для очень больших или очень маленьких файлов. Для файлов размером от 1 кб до 20 мегабайт прочитывание всего файла в поток будет работать намного быстрее и эффективнее.

Автор: December 18.11.2003, 23:38
[offtop]
TStrings rules! Наверно, мой самый любимый инструмент.
[/offtop]

Автор: Pakshin A. S. 19.11.2003, 19:49
А если в одну строчку:
Код

RichEdit1.Lines.LoadFromFile(FileName);

Только ScrollBars должно быть ssBoth (для красоты)

Автор: Georg4 21.11.2003, 02:19
Цитата
Только ScrollBars должно быть ssBoth (для красоты)


Обязательно учту!!:)
Теперь я делаю чтоб провыеряло являются ли последние 2(или1) символа цифрами, и если нет то убрать оба(или тот кторый не цифра)

Автор: Guest 21.11.2003, 11:18
Простые задачи должны иметь простые решения!

Определяем строковую переменную (побольше)
Определяем символьную переменную (под 1-н символ)

организуем прорамму
...
Читаем символ из файла
Цикл пока - while (h = #10) OR (h = #13) then читаем сивол;
...
Т.е. #10, #13 обозначают конец строки.

Сейчас точно не помню. Загони в паскаль и на пошаговом троссировщике посмотри.

И все! Ни каких танцев с бубном! Просто 1-н условный цикл.

Автор: Guest 21.11.2003, 11:21
Простые задачи должны иметь простые решения!

Определяем строковую переменную (побольше) - s
Определяем символьную переменную (под 1-н символ) - h

организуем прорамму
...
Читаем символ из файла
Цикл пока - while (h = #10) OR (h = #13) then читаем сивол;
s:= s + h;
Тут h уже точно не конец строки.
...
загоняем s в файл.

Т.е. #10, #13 обозначают конец строки.

Сейчас точно не помню. Загони в паскаль и на пошаговом троссировщике посмотри.

И все! Ни каких танцев с бубном! Просто 1-н условный цикл.

Автор: Paradox 21.11.2003, 12:42
И сколько по твоему это будет работать с файлом килобайт на сорок

Автор: beif 22.11.2003, 09:10
ДА, посимвольно рабоатать очень долго. Со строками гораздо быстрее и проще - TStrings рулит smile.gif

Автор: Black_Joker 22.11.2003, 09:23
За сколько партия прикажет - за столько и закончит.
Зато предельно просто и предельно надежно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)