Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.10.2020, 18:29   #1
cb251132
Пользователь
 
Регистрация: 29.06.2008
Сообщений: 23
По умолчанию TFileStream

Код:
procedure TForm1.Button2Click(Sender: TObject);
var
f:Tstringlist;
begin
randomize;
      f:=Tstringlist.Create;
      f.LoadFromFile('d:\111.txt');
      memo2.Lines.Add(inttostr(RandomRange(1,f.Count))+':'+chr(9)+f[RandomRange(1,f.Count)]);
f.Free;

end;
С помощью данного кода используя счетчик случайных чисел извлекается и выводится произвольная строка из текстового файла. Но данный код не работоспособен в случае, если размер текстового файла составляет 1,3 Gb, так как это влечет переполнение памяти.
Прошу помочь реализовать эту задачу через класс TFileStream.
cb251132 вне форума Ответить с цитированием
Старый 02.10.2020, 19:05   #2
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

чего-то как-то разбираля с большими файлами, размер которых переваливает за 7-8 Гбайт.
код работает - большие файы определяет, находит и размер их выдаёт без ошибок.
FileNeme = путь+ имя файла.
Код:
//----- определение размера большого нетипизированного файла в байтах ----------
function GetFileSizeEx(FileName:string):Int64;
type TFileSizeRec=record case byte of
      0:(FullSize:Int64);
      1:(dwSizeLow,dwSizeHigh:Longword);
end;
var FSize:TFileSizeRec;
    hFile:THandle;
begin
   FSize.FullSize:=0;
   Result:=0;
   hFile:=CreateFile(PChar(FileName),0,0,nil,OPEN_EXISTING,0,0);
   if(hFile<>INVALID_HANDLE_VALUE)then
   begin
      try
         FSize.dwSizeLow:=GetFileSize(hFile,@FSize.dwSizeHigh);
         if(FSize.dwSizeLow=$FFFFFFFF)and(not Win32Check(LongBool(GetLastError)))then
         Result:=0
         else
         Result:=FSize.FullSize;
         finally
         CloseHandle(hFile);
      end;
   end
   else RaiseLastWin32Error;
end;
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 02.10.2020, 19:18   #3
cb251132
Пользователь
 
Регистрация: 29.06.2008
Сообщений: 23
По умолчанию

Цитата:
Сообщение от NetSpace Посмотреть сообщение
чего-то как-то разбираля с большими файлами, размер которых переваливает за 7-8 Гбайт.
код работает - большие файы определяет, находит и размер их выдаёт без ошибок.
FileNeme = путь+ имя файла.
Код:
//----- определение размера большого нетипизированного файла в байтах ----------
function GetFileSizeEx(FileName:string):Int64;
type TFileSizeRec=record case byte of
      0:(FullSize:Int64);
      1:(dwSizeLow,dwSizeHigh:Longword);
end;
var FSize:TFileSizeRec;
    hFile:THandle;
begin
   FSize.FullSize:=0;
   Result:=0;
   hFile:=CreateFile(PChar(FileName),0,0,nil,OPEN_EXISTING,0,0);
   if(hFile<>INVALID_HANDLE_VALUE)then
   begin
      try
         FSize.dwSizeLow:=GetFileSize(hFile,@FSize.dwSizeHigh);
         if(FSize.dwSizeLow=$FFFFFFFF)and(not Win32Check(LongBool(GetLastError)))then
         Result:=0
         else
         Result:=FSize.FullSize;
         finally
         CloseHandle(hFile);
      end;
   end
   else RaiseLastWin32Error;
end;
Благодарю за ответ, но вопрос в другом - как из такого громадного текстового файла вытащить всего лишь одну строку, выбранную произвольно с помощью счетчика случайных чисел.
cb251132 вне форума Ответить с цитированием
Старый 03.10.2020, 10:04   #4
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от cb251132 Посмотреть сообщение
Благодарю за ответ, но вопрос в другом
Как-раз недавно сталкивался с такой проблемой. Задаёшь один вопрос, а тебе отвечают на другой. Оффтопят, товарищи.

Цитата:
Сообщение от cb251132 Посмотреть сообщение
если размер текстового файла составляет 1,3 Gb
что у вас за текстовое файлы такие?
BLACK_RAIN вне форума Ответить с цитированием
Старый 03.10.2020, 12:29   #5
cb251132
Пользователь
 
Регистрация: 29.06.2008
Сообщений: 23
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
что у вас за текстовое файлы такие?
Ничего особенного. Текстовый файл содержит наборы неповторяющихся комбинаций чисел. В каждой строке такая последовательность. Всего таких наборов более 52 млн. единиц. А чтобы вытащить оттуда одну случайным образом выбранную - оказывается непростая задача.

Последний раз редактировалось cb251132; 03.10.2020 в 14:58.
cb251132 вне форума Ответить с цитированием
Старый 03.10.2020, 14:48   #6
cb251132
Пользователь
 
Регистрация: 29.06.2008
Сообщений: 23
По умолчанию

Код:
var
    f : TFileStream;  //объявляем переменную
    i:integer;
    buf : array [0..20] of char;  //буфер для хранения прочитанных данных
begin
    //открываем файл filename.txt для чтения и записи:
    randomize;
    i:=randomrange(1,52000000); // 52000000 - приблизительно столько строк в файле
    f := TFileStream.Create('d:\111.txt', fmOpenRead);
    //перемещаемся на i символов вперед:
              f.Seek(i, soFromBeginning);
    //читаем в буфер 20 символов из установленной позиции:
              f.Read(buf, 20);
              Memo1.Lines.Add(buf); //скопировали эти 20 символов в Memo
    //уничтожаем объект и тем самым закрываем файл:
    f.Free;
end;
Доступа к отдельно взятой строке нет. Поэтому результат совсем не тот. Из строк вырываются их части с неравным количеством символов. Как получить доступ к отдельно взятой строке, наподобие TStringlist?

Последний раз редактировалось cb251132; 03.10.2020 в 14:57.
cb251132 вне форума Ответить с цитированием
Старый 03.10.2020, 16:37   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

вар.1. предварительно обеспечить в файле одинаковый размер ВСЕХ строк.

зная размер строки задать размер буфера
зная размер и номер нужной строки рассчитать позицию.

вар.2. работать с TextFile
Код:
for j:=x to n do ReadLn(file, s);
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 03.10.2020, 17:57   #8
cb251132
Пользователь
 
Регистрация: 29.06.2008
Сообщений: 23
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
вар.1. предварительно обеспечить в файле одинаковый размер ВСЕХ строк.
Одна строка занимает минимум 17 байт, максимум 26 байт, так как состоит из сочетания символов табуляции служащих разделителем (величина постоянная 8 шт. в любой строке) и сочетаний однозначных, двузначных чисел. Одинаковый размер обеспечить невозможно.
cb251132 вне форума Ответить с цитированием
Старый 03.10.2020, 18:02   #9
cb251132
Пользователь
 
Регистрация: 29.06.2008
Сообщений: 23
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
вар.2. работать с TextFile
Код:
for j:=x to n do ReadLn(file, s);
К сожалению, да. Но это такой медленный способ, в сравнении с молниеносной обработкой Tfilestream, что просто одно расстройство.
cb251132 вне форума Ответить с цитированием
Старый 03.10.2020, 21:49   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
и сочетаний однозначных, двузначных чисел. Одинаковый размер обеспечить невозможно.
ну почему же. Вполне можно любому числу выделить одинаковое число позиций.
Заполнять незначащие позиции можно как пробелом, так и 0.
Код:
9
 9
09
три варианта записи одного и того же числа.
Код:
format('%.8d %8d', [n, n*20]); // разный вывод двух чисел НО каждое из которых займет ровно 8 позиций.
кроме того любую строку можно дополнять пробелами ПОСЛЕ вывода всех чисел.
Код:
s --строка с числами
spacestr -- строка с пробелами желаемой длины строки вывода
r:=copy(s +spacestr, 1, length(spacestr)); //строка для вывода
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 03.10.2020 в 22:01.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
аналог TFileStream JUDAS C++ Builder 5 14.06.2015 20:25
TFileStream Baburek C++ Builder 3 04.07.2013 10:13
проблемы с TFileStream andrey4623 Общие вопросы Delphi 9 01.11.2007 20:44
TFilestream UnD)eaD)Snake Win Api 1 27.09.2007 21:22