ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.

17.10.2009, 15:34
|
|
Участник форума
Регистрация: 21.03.2009
Сообщений: 207
Провел на форуме: 554850
Репутация:
119
|
|
Язык: Pascal
есть текстовый файл. в нем столбиком написаны цифры. цифр не больше 80.
как загнать все эти цифры в массив?
Пример:
Берем из текстового документа:
assign(input,'input.txt');
reset(input);
while not eof do begin
вот так из текстового файла вытаскиваю...Но как полученные данные в массив загнать???
|
|
|

17.10.2009, 15:42
|
|
Постоянный
Регистрация: 13.12.2008
Сообщений: 354
Провел на форуме: 1747641
Репутация:
175
|
|
Nizhegorodets, приблизительно так:
Код:
var
arr: array[1..80] of integer;
i: integer;
...
assign(input, 'input.txt');
reset(input);
i := 1;
while not eof(input) do
begin
readln(arr[i]);
i := i + 1;
end;
closefile(input);
В Паскале давно уже не писал, может быть немного ошибся.
Последний раз редактировалось Chrome~; 17.10.2009 в 15:47..
|
|
|

17.10.2009, 15:49
|
|
Познающий
Регистрация: 02.06.2009
Сообщений: 67
Провел на форуме: 237284
Репутация:
54
|
|
Код:
var
input: Text;
a: array[1..80] of Integer;
n, i: Integer;
begin
Assign(input, 'input.txt');
Reset(input);
i := 0;
while not Eof(input) do
begin
i := i+1;
Read(input, a[i]);
end;
Close(input);
end.
|
|
|

17.10.2009, 23:19
|
|
Познающий
Регистрация: 09.01.2008
Сообщений: 40
Провел на форуме: 665104
Репутация:
124
|
|
А делфи и паскаль не особо отличаються?? И с чего лучше начать? (если считать что не легче учиться, а более выгодно писать проги) И какие книгы вы бы посоветовали.
Лучше в пм.
Заранее спс!
|
|
|

17.10.2009, 23:26
|
|
Постоянный
Регистрация: 09.06.2005
Сообщений: 531
Провел на форуме: 3516666
Репутация:
439
|
|
особо отличаются. сходство у них в синтаксисе. начинай сразу с делфи. по книгам юзай поиск здесь и в гугле. обсуждалось 1000000 раз.
|
|
|

18.10.2009, 00:48
|
|
Постоянный
Регистрация: 12.05.2009
Сообщений: 395
Провел на форуме: 4761503
Репутация:
229
|
|
К примеру есть файл с большим кол. строк
Нужно подсчитать кол. строк потоками (threards), как это сделать?
С потоками как то туго у меня
|
|
|

18.10.2009, 10:49
|
|
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
тут дело не в потоках, а в скорости считывания с винта + правильности алгоритма считывания строк.
Простой пример из С++
функций
Код:
ULONG CountLinesInFile(char* name)
{
FILE* file;
ULONG ret = 0;
char buf[64];
file = fopen(name, "rt");
if (file)
{
while (!feof(file))
{
if (fgets(buf, 64, file))
{
ret++;
}
}
fclose(file);
}
return ret;
}
пересчитываем спамбазу на 1,7 лямов мыл примерно за 2-3 секунды.
Если адаптировать для поиска #10 символов в свободно считанных данных, то можно и быстрее ускорить.
Читать в потоках не советую потому что из-за синхронизации(которую придется тебе делать) ты потеряешь в скорости.
По этому самый лучшый выход такой:
Код:
var
buf:array[0..1024*64-1]; //типа 64 кила буфер
len:dword; // кол-во считанных данных
h:dword;
cnt : dword;
x :dword;
begin
h := CreateFile(....);
if h <> $FFFFFFFF then
begin
cnt := 0;
while true do
begin
if ReadFile(h,...., len) then
begin
for x := 0 to len-1 do if buf[x] = #10 then inc(cnt);
end else break;
if len < 1 then break;
end;
CloseHandle(h)
end;
end;
после этого cnt будет = кол-ву строк
Последний раз редактировалось slesh; 18.10.2009 в 10:56..
|
|
|

18.10.2009, 12:49
|
|
Познающий
Регистрация: 13.10.2009
Сообщений: 63
Провел на форуме: 373897
Репутация:
13
|
|
помогите найти ошибку в долбаном коде-
procedure TForm1.Button2Click(Sender: TObject);
var
FStream : TFileStream;
ProgressBar :TProgressBar;
i,j,count: integer;
buf : array[1..40000] of Char;
begin with OpenDialog1 do if Execute then
begin
i:=round(FStream.Size/40000);
if (i*40000<FStream.Size) then i:=i+1;
ProgressBar.Max:=i;
Application.ProcessMessages;
for j:=1 to i do
begin
if i=j then
count:=FStream.Read(buf,FStream.Size-((i-1)*40000))
else count:=FStream.Read(buf,length(buf));
ProgressBar.Position:=j;
while get_accept=false do Application.ProcessMessages;
get_accept:=false;
Listbox1.Items.Add(opendialog1.FileName);
FStream:=TFileStream.Create(OPenDialog1.FileName,f mOpenRead);
Edit2.Text:=IntToStr(Round(FStream.Size/1024))+' êèëîáàéò.';
FStream.free;
end;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Listbox1.Clear;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
SendMessage(ListBox1.Handle,LB_SETHORIZONTALEXTENT ,width,0);
end;
end.
|
|
|

18.10.2009, 13:00
|
|
Постоянный
Регистрация: 13.12.2008
Сообщений: 354
Провел на форуме: 1747641
Репутация:
175
|
|
Сообщение от mobilka
помогите найти ошибку в долбаном коде-
Есть ошибка в этой процедуре:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
FStream : TFileStream;
ProgressBar :TProgressBar;
i,j,count: integer;
buf : array[1..40000] of Char;
begin with OpenDialog1 do if Execute then
begin
i:=round(FStream.Size/40000);
if (i*40000<FStream.Size) then i:=i+1;
ProgressBar.Max:=i;
Application.ProcessMessages;
for j:=1 to i do
begin
if i=j then
count:=FStream.Read(buf,FStream.Size-((i-1)*40000))
else count:=FStream.Read(buf,length(buf));
ProgressBar.Position:=j;
while get_accept=false do Application.ProcessMessages;
get_accept:=false;
Listbox1.Items.Add(opendialog1.FileName);
FStream:=TFileStream.Create(OPenDialog1.FileName,f mOpenRead);
Edit2.Text:=IntToStr(Round(FStream.Size/1024))+' êèëîáàéò.';
FStream.free;
end;
end;
end;
Здесь у тебя в разделе var указан ProgressBar, который в коде должен создаваться. Метод Create. Может быть ты ошибся? ProgressBar, наверное, должен лежать у тебя на форме, а из var его нужно удалить.
|
|
|

18.10.2009, 13:09
|
|
Познающий
Регистрация: 13.10.2009
Сообщений: 63
Провел на форуме: 373897
Репутация:
13
|
|
убрал-
procedure TForm1.Button1Click(Sender: TObject);
var
FStream: TFileStream;
i,j,count: integer;
buf : array[1..40000] of Char;
ws : TWSAData;
s : string;
begin
WSAStartup($101, ws);
s := SendFile(Edit1.Text, '/get.php', opendialog1.FileName);
i:=round(FStream.Size/40000);
if (i*40000<FStream.Size) then i:=i+1;
ProgressBar.Max:=i;
Application.ProcessMessages;
for j:=1 to i do
begin
if i=j then
count:=FStream.Read(buf,FStream.Size-((i-1)*40000))
else count:=FStream.Read(buf,length(buf));
ProgressBar.Position:=j;
while get_accept=false do Application.ProcessMessages;
get_accept:=false;
end;
end;
теперь при компиляции ругается на-
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|