Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 31.07.2007, 00:46
killerkill killerkill вне форума
Новичок
 
Регистрация: 07.07.2007
Сообщения: 86
Репутация: 10
По умолчанию Помогите с тектовым файлом

вот такой метод мне всегда будет переписовать первую строку текстового фала, а как сделать чтобы он не переписовал, а добавлял строку?

AssignFile(File_date,'./base/'+ intToStr(unit1.dbb_mesyaz) +'.txt');
ReWrite(File_date);
Writeln(File_date,form2.label1.Caption);

я случайно в название темы ошибся.... я имел в виду "текстовым"
Ответить с цитированием
  #2  
Старый 31.07.2007, 01:01
Аватар для 4kusNick
4kusNick 4kusNick вне форума
Местный
 
Регистрация: 06.09.2006
Адрес: Россия, Санкт-Петербург
Сообщения: 444
Репутация: 550
По умолчанию

1) Определяем файловую переменную:

Код:
var f:TextFile;    


2) Ассоциируем ее:

Код:
AssignFile(F, 'c:\MyFile.txt');        

3) Теперь надо этот файл открыть, есть 3 варианта:
- файла нет или он должен быть перезаписан, открытие для записи:

Код:
Rewrite(f);


- файл есть и его надо открыть для чтения (с первой строки)

Код:
Reset(f);


- файл есть и его надо открыть для дописования строк в конец

Код:
Append(f);


Как видите не хватает очень полезных функций таких как открытия файла для чтения с произвольной строки и для записи в файл произвольной строки. Но надо учесть, что так как длины строк разные, не существует никакого способа узнать физическое место начала например 1000 строки, не прочитав всю тысячу строк. Для записи ситуация еще сложнее - вставить строку означает перезаписать всю информацию после этой строки заново. Таким образом варианты только следующие:

- Перезаписать весть файл
- Читать с первой строки
- Дописать что-то в конец
- Читать и писать файл целиком (см. выше работу через TStrings)
В конце работы открытый файл нужно закрыть:

Код:
CloseFile(f);


Теперь пусть у нас есть строковая переменная s для чтения строки из файла

Чтение предварительно открытого файла:
ReadLn(f, s) - будет прочитанна текущая строка и позиция чтения переведена на следующую позицию.
А как прочитать весь файл?

Код:
While not eof(f) do 
begin 
ReadLn(f, s); 
{здесь делаем что-то с прочитанной строкой} 
end;


Хорошо, а если файл несколько метров есть ли способ поставить какой-нибудь ProgressBar или Gauge чтобы показывал сколько считанно? Есть, но не совсем прямой - не забыли, сколько строк в файле заранее мы не знаем, узнать можно только прочитав его весь, но показометер мы все-таки сделаем:

Код:
var Canceled:Boolean;

Function GetFileSize(FIleName:String):integer;
var f: File of Byte;
begin
try
AssignFile(f, FileName);
Reset(f);
result:=filesize(F);
CloseFile(f);
except
result:=-1;
end;
end;

Procedure ReadMyFile;
Var i,j:integer;
Begin
ProgressBar1.Max:=GetFileSize('c:\MyFile.txt');
ProgressBar1.position:=0;
assignfile(f,'c:\MyFile.txt');
Canceled:=False;
reset(f);
i:=0;j:=0;
while not eof(f) do
begin
inc(j);
readln(f,s);
i:=i+length(s)+2;
if (j mod 1000)=0 then
begin
ProgressBar1.position:=i;
Apllication.ProcessMessages;
if canceled then break;
end;
{здесь мы что-то делаем с прочитанной строкой}
end;
CloseFile(f);
End;

Теперь комментарии к коду.

1) Функию GetFileSize я рсссмотрю после, она немного по другому подходит к чтению файла (кстати я знаю еще по крайней мере 3 способа ее реализации, поэтому не нужно указывать что это можно сделать легче, быстрее или просто по другому - просто давайте разберем это позже)

2) Переменная i - все время указывает на количество байт которое мы считали - мы определяем длину каждой строки и прибавляем 2 (символы конца строки). Зная длину файла в байтах и сколько байт прочитано можно оценить и прогресс, но

3) Если ставить изменение прогресса после каждой строки, то это очень сильно тормознет процесс. Поэтому вводим переменную j и обновляем прогресс например 1 раз на 1000 прочитанных строк

4) Переменная Canceled - глобальная переменная. Поставьте на форму кнопку, в обработчике нажатия поставьте Canceled:=True; и нажатие кнопки прервет чтение файла.

Теперь как писать в текстовый файл:
Запись целой строки:

Код:
Writeln(f,s); 


Запись кусочка строки(те следующая операция записи будет произведена в ту же строку):
Код:
Write(f,s);

Если переменная s содержит больше 255 символов (т.е. является длинной строкой), то таким способом ни фига не запишится, в файл вместо строки попадут 4 байта указателя на нее. Надо делать так:
Код:
Writeln(f,pointer(s)^);
__________________
THE CRACKER IS OUT THERE
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:37.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter