| 
| 
 | Вопрос # 5 078/ вопрос решён / | 
 |  Доброго времени суток, уважаемые эксперты!Как мне сделать так чтобы сгенерировался файл с последовательностью чисел (например inc(i) до числа 1000000000). Вот код я сделал, но это очень долго выходит, нужно чтобы быстрее выполнялась программа. как это можно сделать? и есть ли переменная большая int64?
 Приложение:Переключить в обычный режим unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls; type  TForm1 = class(TForm)    Memo1: TMemo;    Button1: TButton;    Label1: TLabel;    Edit1: TEdit;    Label2: TLabel;    Button2: TButton;    Edit2: TEdit;    Button3: TButton;    Label3: TLabel;    procedure FormCreate(Sender: TObject);    procedure Button1Click(Sender: TObject);    procedure Button2Click(Sender: TObject);    procedure chis;    procedure Button3Click(Sender: TObject);  private    { Private declarations }   public    { Public declarations }   end; var  Form1: TForm1;   f:textfile;   i,a,b:int64; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject);beginb:=strtoint(edit2.Text);chis;end; procedure TForm1.Button2Click(Sender: TObject);beginassignfile(f,(extractfilepath(Application.ExeName)+'\'+edit1.Text+'.txt'));rewrite(f);write(f,memo1.Text);closefile(f);end; procedure TForm1.Button3Click(Sender: TObject);beginmemo1.Clear;end; procedure TForm1.chis;beginrepeatMemo1.Lines.Add(inttostr(i));inc(i);until (i=b);end; procedure TForm1.FormCreate(Sender: TObject);begin {if FileExists(extractfilepath(Application.ExeName)+'\'+edit1.Text) then  else  i:=0; end; end. 
|  |   Вопрос задал: 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™ (статус: Доктор наук), 10 марта 2011, 16:07 [#1]:Несколько наводящих вопросов. 1. Зачем тебе такой (текстовый) файл нужен? Как ты его собираешься использовать?
 2. Для числа 1000000000 вполне подойдёт тип Cardinal, т.к. это число влезает в 4 байта (0x3B9ACA00).
 3. Причём тут Memo?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Andrew_Cyber (статус: Посетитель), 10 марта 2011, 16:10 [#2]:я хочу сохранить файл с такими числами, чтоб каждое число было на каждой строчке. через мемо вывожу числа и сохранаю в файл. можете подсказать лучше код?
 |  
|   | min@y™ (статус: Доктор наук), 10 марта 2011, 16:13 [#3]: Цитата (Andrew_Cyber): я хочу сохранить файл с такими числами, чтоб каждое число было на каждой строчке.  А зачем это нужно? Для каких целей?
 
 Цитата (Andrew_Cyber): можете подсказать лучше код?  Могу, конечно, но сначал я хочу узнать, для чего такой файл.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Andrew_Cyber (статус: Посетитель), 10 марта 2011, 16:18 [#4]:ну просто для общего образования, надо же же знать, а как это сделать сообразить не могу |  
|   | Вадим К (статус: Академик), 10 марта 2011, 16:20 [#5]:я думаю, для начала нужно было сделать оценку как минимум размера файла. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Andrew_Cyber (статус: Посетитель), 10 марта 2011, 16:23 [#6]:да размер файла пока не важен, сам процесс интересен |  
|   | min@y™ (статус: Доктор наук), 10 марта 2011, 16:26 [#7]: Цитата (Andrew_Cyber): сам процесс интересен  Сам процесс чего? Процесс создания текстовых файлов или процесс создания текстовых файлов громадного размера, забитых бесполезной информацией?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Вадим К (статус: Академик), 10 марта 2011, 16:27 [#8]:как раз размер файла и важен, потому что assignfile/reset и компания перестают адекватно работать при размерах файла больше 2гига. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | 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™ (статус: Доктор наук), 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 (статус: Студент), 10 марта 2011, 16:55 [#12]:Andrew_Cyber: А где открытие файла? "Digital Networked Knight" |  
|   | Вадим К (статус: Академик), 10 марта 2011, 16:57 [#13]:в его варианте его тоже не было. я подозреваю, что он открывается где то в другом месте. Я просто написал эквивалентный код. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | 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™ (статус: Доктор наук), 12 марта 2011, 12:47 [#15]:Так мы и не узнали военную тайну про то, зачем аффтару 9-гиговый текстовый файл с цифрами... КАКАЯ ЖАЛЬ!!!   Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Andrew_Cyber (статус: Посетитель), 12 марта 2011, 13:06 [#16]:там больше 9 гигов...   |  
|   | min@y™ (статус: Доктор наук), 12 марта 2011, 13:25 [#17]: Цитата (Andrew_Cyber): там больше 9 гигов...  Неважно. Главное - ЗАЧЕМ?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Andrew_Cyber (статус: Посетитель), 12 марта 2011, 13:29 [#18]:ПРОСТО ТАК, я же уже писал. Его можно легко удалить. 
 Главное я знаю теперь как этот файл создавать.
 |  
|   | Толяныч (статус: 4-ый класс), 13 марта 2011, 11:41 [#19]:Несерьезный вопрос тянет на несерьезый комментарий. По ассоциации вспомнилось :
 " У не был такой голос, что его хотелось записать на пластинку. А пластинку разбить ! "
 ( Это из эпохи виниловых дисков )
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |