Аватар для Tonikan
0 / 0 / 0
Регистрация: 13.10.2009
Сообщений: 83

Деление файла на части

08.04.2017, 02:24. Показов 3880. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, пожалуйста, новичку:
У меня есть последовательность чисел, записанная в txt файл, каждое с новой строки.
Мне нужно что бы программа брала из этого файла 50 значений и сохраняла их во второй файл. Далее этот второй файл очищается и туда заносятся следующие 50 значений из первого файла. Так повторяется пока не будут перебраны все значения.
Подскажите, как это реализовать?
Хотя бы скажите - как правильно считывать значения? Я делаю так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
begin
assignfile(f,'test.txt');
reset(f);
For i:=1 to dl do
 begin
 read(f,a[i]);
 write(a[i]);
 writeln;
 end;
closefile(f);
end;
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.04.2017, 02:24
Ответы с готовыми решениями:

Деление файла на части и получение их хешей
Не смотрите особо на название, я не знаю как назвать то, что хочу сделать =) Но смысл сейчас постараюсь объяснить... Я считываю файл...

Деление изображения на части
Кто-нибудь знает программу по делению изображения на части. Мне нужно изображение с разрешением около 10000 х 2000 разделить на части с...

Деление массива на 2 части
Есть массив, размеров в 100 случайных элементов. Так же есть второй пустой массив размерностью в 50. Нужно значения второй половины...

28
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
12.04.2017, 12:04
Студворк — интернет-сервис помощи студентам
add - это функция
к ней нельзя ничего присвоить
1
 Аватар для Tonikan
0 / 0 / 0
Регистрация: 13.10.2009
Сообщений: 83
12.04.2017, 13:23  [ТС]
Я передачу значений сделал. Сейчас передаёт но не правильно. Правильно копируются только первая пачка значений, а дальше у меня получается какой-то бред (
Пожалуйста, подскажите,как исправить передачу, чтобы первая программа нарезала по 50 значений, беря их из файла, и отправляла второй, а вторая принимала эти значения кусочками по 50 в memo?
Программа, которая режет по 50 значений и передаёт
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
procedure TForm2.Button1Click(Sender: TObject);
var
  i, z, c: integer;
  inp, outstr: TStrings;
  CDS: TCopyDataStruct;
  TempStr :string;
begin
  z := 0;
  c := 0;
  i := 0;
  inp := TStringList.Create;
  outstr := TStringList.Create;
  inp.LoadFromFile('test.txt');
  for i := 0 to inp.Count - 1 do
  begin
    outstr.Add(inp[i]);
    z := z + 1;
    if z > 50 then
      z := 0;
    if z = 0 then
    begin
    TempStr:= outstr.Text;
    CDS.dwData := CMD_SETLABELTEXT;  //Устанавливаем тип команды
    CDS.cbData := Length(TempStr) + 1;  //Устанавливаем длину передаваемых данных
    GetMem(CDS.lpData, CDS.cbData);  //Выделяем память буфера для передачи данных
    try
    StrPCopy(CDS.lpData, AnsiString(TempStr)); //Копируем данные в буфер
    SendMessage(FindWindow(nil, 'StringReceiver'), //Отсылаем сообщение в окно с заголовком StringReceiver
                  WM_COPYDATA, Handle, Integer(@CDS));
    finally
    FreeMem(CDS.lpData, CDS.cbData); //Высвобождаем буфер
     end;
      inc(c);
    end;
  end;
  inp.Free;
  outstr.Free;
end;
Программа которая принимает:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm2 = class(TForm)
    Memo1: TMemo;
  private
    { Private declarations }
    procedure WMCopyData(var MessageData: TWMCopyData); message WM_COPYDATA;
  public
    { Public declarations }
  end;
 
const
  CMD_SETLABELTEXT = 1;
var
  Form2: TForm2;
  temp:string;
 
implementation
 
{$R *.dfm}
procedure TForm2.WMCopyData(var MessageData: TWMCopyData);
begin
  //Устанавливаем свойства метки, если заданная команда совпадает
  if MessageData.CopyDataStruct.dwData = CMD_SETLABELTEXT then
  begin
    //Устанавливаем текст из полученных данных
    temp:= PAnsiChar((MessageData.CopyDataStruct.lpData));
    Memo1.Lines.Add(temp);
    MessageData.Result := 1;
  end
  else
    MessageData.Result := 0;
end;
 
 
end.
0
 Аватар для Animalia
225 / 80 / 35
Регистрация: 01.04.2017
Сообщений: 182
12.04.2017, 17:42
outstr.Clear; - очистит лист отправки. Переменная C не используется, Z по факту то же не нужна - можно обратиться к свойству Count (число строк).
тогда код отправки примет вид
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
procedure TForm2.Button1Click(Sender: TObject);
const
  CMD_SETLABELTEXT = 1;
var
  i: integer;
  inp, outstr: TStrings;
  CDS: TCopyDataStruct;
  TempStr: string;
begin
  inp := TStringList.Create;
  outstr := TStringList.Create;
  inp.LoadFromFile('test.txt');
  for i := 0 to inp.Count - 1 do
  begin
    outstr.Add(inp[i]);
    if outstr.Count = 50 then
    begin
      TempStr := outstr.Text;
      CDS.dwData := CMD_SETLABELTEXT; // Устанавливаем тип команды
      CDS.cbData := Length(TempStr) + 1;
      // Устанавливаем длину передаваемых данных
      GetMem(CDS.lpData, CDS.cbData);
      // Выделяем память буфера для передачи данных
      try
        StrPCopy(CDS.lpData, AnsiString(TempStr)); // Копируем данные в буфер
        SendMessage(FindWindow(nil, 'WM_COPYDATA-Receiver'),
          // Отсылаем сообщение в окно с заголовком StringReceiver
          WM_COPYDATA, Handle, integer(@CDS));
      finally
        FreeMem(CDS.lpData, CDS.cbData); // Высвобождаем буфер
      end;
      outstr.Clear;
    end;
  end;
  inp.Free;
  outstr.Free;
end;

без outstr.Clear; получается что считываете 51 - отправляете, считываете еще 51 отправляете 102, опять считываете 51 отправляете 153... дальше продолжать не буду

Не по теме:

кстати да, частая ошибка: если начало массива 0, а конец 50, то элементов в массиве 51.
Count возвращает именно количество строк, то есть диапазон по которому можно обратиться при Count=50 от 0 до 49

1
 Аватар для Tonikan
0 / 0 / 0
Регистрация: 13.10.2009
Сообщений: 83
13.04.2017, 00:33  [ТС]
Спасибо. Подскажите, пожалуйста, а есть в Delphi какая-нибудь функция, позволяющая получить время прихода строки в memo второй программы?
Я должен знать сколько у меня есть времени между приходами строк из первой программы. Для понимания возможного объема команд по работе с данными во второй программе.
Я обычно пользуюсь Matlab, там есть удобная функция cputime, возвращающая процессорное время. Может быть в Delphi есть что то похожее, чем я могу замерить время между приходами строк из первой программы?

Добавлено через 32 минуты
Поискал, понял, что есть компонент Timer, но он, я так понимаю, измеряет в милисекундах, а у меня между получением строк милесекунды или микро? Timer даст в данном случае грубый результат?
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
13.04.2017, 05:26
замеряется время обычно GetTickCount. Это миллисекунды с момента запуска системы
если нужно именно время HH:MM:SS - функция Now():TDateTime. Но там на уровне мсек уже не очень точно
1
 Аватар для Tonikan
0 / 0 / 0
Регистрация: 13.10.2009
Сообщений: 83
13.04.2017, 13:39  [ТС]
Спасибо. Написал код, чтобы после пришедших из первой программы значений, выводилось время их поступления. А, время всё время одно и то же выводится.
Это программа выполняется так быстро, что таймер не успевает затраченное время посчитать или я не правильно меряю?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm2 = class(TForm)
    Memo1: TMemo;
  private
    { Private declarations }
    procedure WMCopyData(var MessageData: TWMCopyData); message WM_COPYDATA;
  public
    { Public declarations }
  end;
 
const
  CMD_SETLABELTEXT = 1;
var
  Form2: TForm2;
  temp:string;
  t,i:integer;
  ts:string;
 
implementation
 
{$R *.dfm}
procedure TForm2.WMCopyData(var MessageData: TWMCopyData);
begin
  //Устанавливаем свойства метки, если заданная команда совпадает
  if MessageData.CopyDataStruct.dwData = CMD_SETLABELTEXT then
  begin
    //Устанавливаем текст из полученных данных
    temp:= PAnsiChar((MessageData.CopyDataStruct.lpData));
    Memo1.Lines.Add(temp);
    t:=GetTickCount;
    ts:=IntToStr(t);
    Memo1.Lines.Add(ts);
    MessageData.Result := 1;
  end
  else
    MessageData.Result := 0;
end;
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
13.04.2017, 14:10
на вид все верно
0
 Аватар для Tonikan
0 / 0 / 0
Регистрация: 13.10.2009
Сообщений: 83
13.04.2017, 14:27  [ТС]
Теперь заработало, почему-то после закрытия/открытия.
А это в милисекундах?
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
13.04.2017, 14:30
Цитата Сообщение от krapotkin Посмотреть сообщение
Это миллисекунды с момента запуска системы
...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.04.2017, 14:30

деление страницы на части
здравствуйте! подскажите, как сделать деление страницы на 2 части как сделано, например, тут. (чтобы часть была на треть, а оставшаяся -...

Деление числа на части C++
Есть код: #include <iostream> #include "math.h" #include <sstream> #include <fstream> #include <iomanip> using namespace...

Деление массива на 3 части
Заданный массив целых чисел делится на три части двумя элементами: максимальным и минимальным. Определите сумму элементов в каждой части...

Деление строки на части
Здравствуйте. В JavaScript почти не соображаю,но нужно средствами javascript из строки вида "access_token=..." взять то,что...

Деление массива на 3 части
сразу говорю что вроде решение должно быть простым но я запутался, и так - есть 1 массив из которого нужно сделать 3 , причем они разные по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Опции темы

Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru