|
Вопрос # 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);
- begin
- b:=strtoint(edit2.Text);
- chis;
- end;
-
- procedure TForm1.Button2Click(Sender: TObject);
- begin
- assignfile(f,(extractfilepath(Application.ExeName)+'\'+edit1.Text+'.txt'));
- rewrite(f);
- write(f,memo1.Text);
- closefile(f);
- end;
-
- procedure TForm1.Button3Click(Sender: TObject);
- begin
- memo1.Clear;
- end;
-
- procedure TForm1.chis;
- begin
- repeat
- Memo1.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]:
Несерьезный вопрос тянет на несерьезый комментарий.
По ассоциации вспомнилось :
" У не был такой голос, что его хотелось записать на пластинку. А пластинку разбить ! "
( Это из эпохи виниловых дисков )
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|