Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 078

/ вопрос решён /

Доброго времени суток, уважаемые эксперты!
Как мне сделать так чтобы сгенерировался файл с последовательностью чисел (например inc(i) до числа 1000000000). Вот код я сделал, но это очень долго выходит, нужно чтобы быстрее выполнялась программа. как это можно сделать? и есть ли переменная большая int64?

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. Memo1: TMemo;
  12. Button1: TButton;
  13. Label1: TLabel;
  14. Edit1: TEdit;
  15. Label2: TLabel;
  16. Button2: TButton;
  17. Edit2: TEdit;
  18. Button3: TButton;
  19. Label3: TLabel;
  20. procedure FormCreate(Sender: TObject);
  21. procedure Button1Click(Sender: TObject);
  22. procedure Button2Click(Sender: TObject);
  23. procedure chis;
  24. procedure Button3Click(Sender: TObject);
  25. private
  26. { Private declarations }
  27.  
  28. public
  29. { Public declarations }
  30.  
  31. end;
  32.  
  33. var
  34. Form1: TForm1;
  35. f:textfile;
  36. i,a,b:int64;
  37.  
  38. implementation
  39.  
  40. {$R *.dfm}
  41.  
  42. procedure TForm1.Button1Click(Sender: TObject);
  43. begin
  44. b:=strtoint(edit2.Text);
  45. chis;
  46. end;
  47.  
  48. procedure TForm1.Button2Click(Sender: TObject);
  49. begin
  50. assignfile(f,(extractfilepath(Application.ExeName)+'\'+edit1.Text+'.txt'));
  51. rewrite(f);
  52. write(f,memo1.Text);
  53. closefile(f);
  54. end;
  55.  
  56. procedure TForm1.Button3Click(Sender: TObject);
  57. begin
  58. memo1.Clear;
  59. end;
  60.  
  61. procedure TForm1.chis;
  62. begin
  63. repeat
  64. Memo1.Lines.Add(inttostr(i));
  65. inc(i);
  66. until (i=b);
  67. end;
  68.  
  69. procedure TForm1.FormCreate(Sender: TObject);
  70. begin
  71. {if FileExists(extractfilepath(Application.ExeName)+'\'+edit1.Text) then
  72.  
  73. else
  74.  
  75. i:=0;
  76.  
  77. end;
  78.  
  79. end.
  80.  


Andrew_Cyber Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Andrew_Cyber (статус: Посетитель)
Вопрос отправлен: 10 марта 2011, 16:00
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Andrew_Cyber!
Оставим за кадром ответ на вопрос - зачем это нужно. И то, что он будет где то около 9-10 гигов...
Также оставим за кадром то, что у мемо есть свой собственный метод сохраниения в файл Memo1.lines.savetofile(имяфайла);
Также оставим за кадром то, что на FAT32 это будет очень сложно сделать (там файлы ограничены в 2 гигабайта).
В целом, тут лучше использовать буферизацию, как минимум примитивную

var
  Str1: TFileStream;
  Writer1: TWriter;
  I: Int64;
begin
  Str1 := TFileStream.Create ('data.txt', fmCreate or fmOpenWrite);
  Writer1 := TWriter.Create (Str1, 1024);
  try
    Writer1.WriteListBegin;
    for I := 1 to 10000000000 do
      Writer1.WriteString (inttostr(i));
    Writer1.WriteListEnd;
  finally
    Writer1.Free;
    Str1.Free;
  end;
end;

Расскажите, почему у Вас возникла такая задача, может и проще решение придумается:) И почему понадобился тип целых, больше int64. В делфи такого нет, но никто не мешает его сделать.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 10 марта 2011, 16:14


Мини-форум вопроса

Всего сообщений: 19; последнее сообщение — 13 марта 2011, 11:41; участников в обсуждении: 5.
min@y™

min@y™ (статус: Доктор наук), 10 марта 2011, 16:07 [#1]:

Несколько наводящих вопросов.
1. Зачем тебе такой (текстовый) файл нужен? Как ты его собираешься использовать?
2. Для числа 1000000000 вполне подойдёт тип Cardinal, т.к. это число влезает в 4 байта (0x3B9ACA00).
3. Причём тут Memo?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Andrew_Cyber

Andrew_Cyber (статус: Посетитель), 10 марта 2011, 16:10 [#2]:

я хочу сохранить файл с такими числами, чтоб каждое число было на каждой строчке. через мемо вывожу числа и сохранаю в файл.
можете подсказать лучше код?
min@y™

min@y™ (статус: Доктор наук), 10 марта 2011, 16:13 [#3]:

Цитата (Andrew_Cyber):

я хочу сохранить файл с такими числами, чтоб каждое число было на каждой строчке.

А зачем это нужно? Для каких целей?

Цитата (Andrew_Cyber):

можете подсказать лучше код?

Могу, конечно, но сначал я хочу узнать, для чего такой файл.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Andrew_Cyber

Andrew_Cyber (статус: Посетитель), 10 марта 2011, 16:18 [#4]:

ну просто для общего образования, надо же же знать, а как это сделать сообразить не могу
Вадим К

Вадим К (статус: Академик), 10 марта 2011, 16:20 [#5]:

я думаю, для начала нужно было сделать оценку как минимум размера файла.
Галочка "подтверждения прочтения" - вселенское зло.
Andrew_Cyber

Andrew_Cyber (статус: Посетитель), 10 марта 2011, 16:23 [#6]:

да размер файла пока не важен, сам процесс интересен
min@y™

min@y™ (статус: Доктор наук), 10 марта 2011, 16:26 [#7]:

Цитата (Andrew_Cyber):

сам процесс интересен

Сам процесс чего? Процесс создания текстовых файлов или процесс создания текстовых файлов громадного размера, забитых бесполезной информацией?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 10 марта 2011, 16:27 [#8]:

как раз размер файла и важен, потому что assignfile/reset и компания перестают адекватно работать при размерах файла больше 2гига.
Галочка "подтверждения прочтения" - вселенское зло.
Andrew_Cyber

Andrew_Cyber (статус: Посетитель), 10 марта 2011, 16:32 [#9]:

ладно ребят, спасибо за помощь, я нашёл решение.
procedure TForm1.chis;
begin
repeat
//Memo1.Lines.Add(inttostr(i));
s:=inttostr(i)+#13#10;
write(f,s);
inc(i);
if i=b then
closefile(f);
until (i=b);
end;
min@y™

min@y™ (статус: Доктор наук), 10 марта 2011, 16:45 [#10]:

Цитата (Andrew_Cyber):

ладно ребят, спасибо за помощь, я нашёл решение.

Ну и за какое время создаётся файл с миллиардом строк внутри?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 10 марта 2011, 16:53 [#11]:

я бы вышеприведенный код как минимум переписал так
procedure TForm1.chis;
begin
  repeat
    s:=inttostr(i);
    writeln(f,s);
    inc(i);
  until (i=b);
  closefile(f);
end;
Не находите, что код заметно проще?
Галочка "подтверждения прочтения" - вселенское зло.
DNK

DNK (статус: Студент), 10 марта 2011, 16:55 [#12]:

Andrew_Cyber: А где открытие файла?
"Digital Networked Knight"
Вадим К

Вадим К (статус: Академик), 10 марта 2011, 16:57 [#13]:

в его варианте его тоже не было. я подозреваю, что он открывается где то в другом месте. Я просто написал эквивалентный код.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 10 марта 2011, 17:09 [#14]:

Цитата (Вадим К):

я бы вышеприведенный код как минимум переписал так

Или вот так:
procedure TForm1.chis;
begin
  repeat
    writeln(f,i);
    inc(i);
  until (i = b);
  closefile(f);
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

12 марта 2011, 12:42: Статус вопроса изменён на решённый (изменил автор вопроса — Andrew_Cyber)

min@y™

min@y™ (статус: Доктор наук), 12 марта 2011, 12:47 [#15]:

Так мы и не узнали военную тайну про то, зачем аффтару 9-гиговый текстовый файл с цифрами... КАКАЯ ЖАЛЬ!!! :(
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Andrew_Cyber

Andrew_Cyber (статус: Посетитель), 12 марта 2011, 13:06 [#16]:

там больше 9 гигов...:)
min@y™

min@y™ (статус: Доктор наук), 12 марта 2011, 13:25 [#17]:

Цитата (Andrew_Cyber):

там больше 9 гигов...:)

Неважно. Главное - ЗАЧЕМ?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Andrew_Cyber

Andrew_Cyber (статус: Посетитель), 12 марта 2011, 13:29 [#18]:

ПРОСТО ТАК, я же уже писал. Его можно легко удалить.

Главное я знаю теперь как этот файл создавать.
Толяныч

Толяныч (статус: 4-ый класс), 13 марта 2011, 11:41 [#19]:

Несерьезный вопрос тянет на несерьезый комментарий.
По ассоциации вспомнилось :
" У не был такой голос, что его хотелось записать на пластинку. А пластинку разбить ! "
( Это из эпохи виниловых дисков )

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:55
Выполнено за 0.03 сек.