• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Работа С Файлами Delphi

  • Автор темы sima12
  • Дата начала
S

sima12

Подскажите пожалуйста, возможно ли вставить в начало документа число.
В процессе работы программы, мы записываем в файл некоторые числа. Далее нам необходимо, вставить в начало файла количество данных чисел, не затирая при этом первый элемент. Можно ли сделать это не используя файл-посредник?
Допустим файл f: 1 4 3 4 45 2 56. посчитали количество чисел, например 7 и записали файл f в виде: 7 1 4 3 4 45 2 56
 
S

sinkopa

Подскажите пожалуйста, возможно ли вставить в начало документа число.
В процессе работы программы, мы записываем в файл некоторые числа. Далее нам необходимо, вставить в начало файла количество данных чисел, не затирая при этом первый элемент. Можно ли сделать это не используя файл-посредник?
Допустим файл f: 1 4 3 4 45 2 56. посчитали количество чисел, например 7 и записали файл f в виде: 7 1 4 3 4 45 2 56
Числа, я так понял, как строковые данные у Вас в файле лежат?
Код:
procedure TForm1.Button1Click(Sender: TObject);
const
ENDOFSTR : Word = 0;
var
f: TMemoryStream;
s: string;
n, count : Integer;
begin
{ читаем файл в поток }
f := TMemoryStream.Create;
f.LoadFromFile('c:\test.txt');

{ дописываем в конец потока #0 (символ завершения длинной строки)}
f.Position := f.Size;
f.WriteBuffer(ENDOFSTR,SizeOf(Char));

{ забираем строчку из памяти потока в строковую переменную }
s := string(PChar(f.Memory));

ShowMessage(s); // '1 4 3 4 45 2 56'

{ подсчет количества "цифровых" данных (те что не пробел) }
count := 0;

n := Pos(' ',s);
while (n > 0) do
begin
Inc(count);
s := Copy(s,n+1,Length(s));
n := Pos(' ',s);
end;
Inc(count);

{ добавляем к строчке (слева) }
s := IntToStr(count)+ ' ' + string(PChar(f.Memory));

ShowMessage(s); // '7 1 4 3 4 45 2 56'

{ очищаем стрим, записываем строку, сохраняем в файл }
f.Clear;
f.WriteBuffer(s[1],Length(s)*SizeOf(Char));
f.Position := 0;
f.SaveToFile('c:\test.txt');
f.Free;
end;
 
C

Cambur

sinkopa, а почему бы просто не использовать TStrings?
по-моему намного проще ....
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!