Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как вставить в начало каждого сохраненного файла


Автор: Serhik_z 15.6.2005, 12:32
Сохраняю файл с 1000 строк, по 200 строк в файл.
Как вставить в начало каждого сохраненного файла строку,
именем которого назван сохраненный файла, без расширения.

Код

var
  Form2: TForm2;
  EditedFile: string;

implementation

uses Unit1;

{$R *.dfm}

// Вывод----------------------
procedure TForm2.Button1Click(Sender: TObject);
var
 m: integer;
begin
 m:= StrToInt(Edit1.Text);
 SaveStringsToFiles(Form1.Memo1.Lines, m);
 Form2.Close;
end;

// Сохранение------------------
function TForm2.SaveStringsToFiles(const AList: TStrings;
  ACountLines: Integer): Boolean;
var
i, x: integer;
List: TStrings;
begin
List:= TStringList.Create;
x:= 1;//Начальный файл с номера 1
for i:= 0 to Alist.Count-1 do
  begin
  List.Add(AList.Strings[i]);
  if ((i+1) mod ACountLines = 0)and(i<>0)
  then
    begin
    List.SaveToFile('L'+IntToStr(x)+'.iso');
    x:= x+1;
    List.Clear;
    end;
  end;
List.SaveToFile('L'+IntToStr(x)+'.iso');
List.Free;
Result:= True;
end;

smile

Автор: Poseidon 15.6.2005, 14:07
Ты сначало создаешь текст того файла, каторый хочешь сохранить, а потом определяешь его имя. Сделай наоборот. Сначало определи имя, а потом создавай текст:

Код
function TForm2.SaveStringsToFiles(const AList: TStrings;
  ACountLines: Integer): Boolean;
var
i, x: integer;
List: TStrings;
FileName: string;
begin
List:= TStringList.Create;
x:= 1;//Начальный файл с номера 1
FileName:= 'L'+IntToStr(x);
List.Add(FileName);
for i:= 0 to Alist.Count-1 do
  begin
  List.Add(AList.Strings[i]);
  if ((i+1) mod ACountLines = 0)and(i<>0)
  then
    begin
    List.SaveToFile(FileName+'.iso');
    x:= x+1;
    FileName:= 'L'+IntToStr(x);
    List.Clear;
    List.Add(FileName+'.iso');
    end;
  end;
List.SaveToFile(FileName+'.iso');
List.Free;
Result:= True;
end;

Автор: Serhik_z 17.6.2005, 12:24
Poseidon - Спасибо!
Можно также вставить в конец текста.

Автор: Poseidon 17.6.2005, 23:06
Цитата(Serhik_z @ 17.6.2005, 12:24)
Можно также вставить в конец текста.
Я не понял, это вопрос или просто уточнение?

Автор: Serhik_z 17.6.2005, 23:56
Вопрос.

Пробавал вставить последней строкой, неполучилось.
А можно вставить как в первом случае, только во всех направлениях.
Тоесть в саму строку, вначале и конце и последней строкой.
Как вверх вниз, вправо влево.

Автор: Poseidon 18.6.2005, 00:09
Serhik_z, ничего не понял. Если нужно вставить название файла в конец этого файла, то используй свой код из первого поста.
Цитата(Serhik_z @ 17.6.2005, 23:56)
А можно вставить как в первом случае, только во всех направлениях.
Тоесть в саму строку, вначале и конце и последней строкой.
Т.е. ты хочешь, что бы в начале и конце каждой строки боло имя файла? И при этом это же имя бало в начале и конце этого файла? Я правильно понял?

Автор: Serhik_z 18.6.2005, 00:45
Вставить последнюю строку.
Компиляция идет, но при запуске программы возникает сбой.
Код

procedure TForm2.Button1Click(Sender: TObject);
var
 m: integer;
begin
 m:= StrToInt(Edit1.Text);
 SaveStringsToFiles(Form1.Memo1.Lines, m);
 Form2.Close;
end; 

function TForm2.SaveStringsToFiles(const AList: TStrings;
  ACountLines: Integer): Boolean;
var
i, x: integer;
List: TStrings;
FileName: string;
 F: Textfile;//для последней строки
begin
List:= TStringList.Create;
x:= 1;//Начальный файл с номера 1
FileName:= 'L'+IntToStr(x);
List.Add(FileName);
for i:= 0 to Alist.Count-1 do
  begin
  List.Add(AList.Strings[i]);
  if ((i+1) mod ACountLines = 0)and(i<>0)
  then
    begin
    List.SaveToFile(FileName+'.iso');
    x:= x+1;
    FileName:= 'L'+IntToStr(x);
    List.Clear;
    List.Add(FileName+'');//Убрать .iso для каждого файла L1 L2 L3
    AssignFile(f, FileName);
  Append(f); 
  Writeln(f, 'Последняя строка');
  Closefile(f);
    end;
  end;
List.SaveToFile(FileName+'.iso');
List.Free;
Result:= True;
end;

Автор: Poseidon 18.6.2005, 00:57
Ты уверен, что сбой именно этот код вызывает? Я только что проверил и у меня все прошло. Какая именно ошибка возникает?
И проверь, действительно-ли у тебя в Edit1 число. А то, если там не число, то из-за этого тоже может быть ошибка.

Автор: Serhik_z 18.6.2005, 01:48
Открываю файл с 1000 строк.
Сохраняю по 200 строк в файл.
Сохраняется 1 файл и не добавляет последнюю строку.
Ошибка File not Found

Код

 AssignFile(f, FileName);
  Append(f); 
  Writeln(f, 'Последняя строка');
  Closefile(f);

Автор: Poseidon 18.6.2005, 02:03
Млин, Serhik_z, проблема-то у тебя пустяковая, только ты обьяснить нормально не можешь, что ты делаешь (т.е. каким кодом) и что хочешь получить из этого. Если ты приведенным тобой выше кодом пытаешься
Цитата(Serhik_z @ 18.6.2005, 01:48)
Сохраняю по 200 строк в файл.
то извени меня...
А ошибка эта возникает из-за того, что в FileName неверный путь к файлу или у этого файла установлен атрибут "только чтение", потаму как Append(f) открывает файл в режиме добавления к уже существующим данным, находящимся в этом файле. И если файла нет (или путь не верно указан), то возникнет эта ошибка. Такое случай нужно предусматреть (с помощью FileExists) и использовать ReWrite(f)

Добавлено @ 02:06
Цитата(Serhik_z @ 18.6.2005, 01:48)
Сохраняется 1 файл и не добавляет последнюю строку.
А это именно из-за того, что возникает ошибка и выполнение кода прекращается

Автор: Serhik_z 18.6.2005, 03:05
Не добавлят в файлы.
Подскажи пример.
Код

function TForm2.SaveStringsToFiles(const AList: TStrings;
  ACountLines: Integer): Boolean;
var
i, x: integer;
List: TStrings;
FileName: string;
 F: TextFile;
begin
List:= TStringList.Create;
x:= 1;
FileName:= 'L'+IntToStr(x);
List.Add(FileName);
for i:= 0 to Alist.Count-1 do
  begin
  List.Add(AList.Strings[i]);
  if ((i+1) mod ACountLines = 0)and(i<>0)
  then
    begin
    List.SaveToFile(FileName+'.iso');
    x:= x+1;
    FileName:= 'L'+IntToStr(x);
    List.Clear;
    List.Add(FileName+'');
//----------------
  AssignFile(f, FileName+'.iso');
  ReWrite(f);
  Writeln(f, 'Последняя строка');
  Closefile(f);
    end;
  end;
List.SaveToFile(FileName+'.iso');
List.Free;
Result:= True;
end;

smile smile smile

Автор: Poseidon 18.6.2005, 03:13
На сколько я понял, тебе нужно добавить в каждый файл еще свою строку в конец. Если так, то вот:

Код
function TForm2.SaveStringsToFiles(const AList: TStrings;
  ACountLines: Integer): Boolean;
var
i, x: integer;
List: TStrings;
FileName: string;
begin
List:= TStringList.Create;
x:= 1;//Начальный файл с номера 1
FileName:= 'L'+IntToStr(x);
List.Add(FileName);
for i:= 0 to Alist.Count-1 do
  begin
  List.Add(AList.Strings[i]);
  if ((i+1) mod ACountLines = 0)and(i<>0)
  then
    begin
    List.Add('Последняя строка');// вот это добавили
    List.SaveToFile(FileName+'.iso');
    x:= x+1;
    FileName:= 'L'+IntToStr(x);
    List.Clear;
    List.Add(FileName+'.iso');
    end;
  end;
List.SaveToFile(FileName+'.iso');
List.Free;
Result:= True;
end;

Автор: Girder 18.6.2005, 03:38
Код
procedure SaveStr(var Str:string; fName:string; Count:integer; Overwrite:boolean);
var Ext:string;
    n,i,j,k,t:integer;
    ft,D:DWord;
    sNF:string;
begin
 fName:=trim(fName);
 Ext:=ExtractFileExt(fName);
 fName:=copy(fName,1,Length(fName)-Length(Ext));
 if (fName='')or(Length(Str)=0)or(Count=0) then exit;
 n:=1;
 j:=1;
 D:=CREATE_NEW;
 if Overwrite then D:=CREATE_ALWAYS;
 while (j<=Length(Str)) do
  begin
   k:=Count;
   i:=j;
   while (k>0)and(j<=Length(Str)) do
    begin
     if (Str[j] in [#10,#13]) then
      begin
       if (j<Length(Str))and(Str[j]<>Str[j+1]) then inc(j);
       dec(k);
      end;
     inc(j); 
    end;
   repeat
    sNF:=fName+IntToStr(n);
    ft:=CreateFile(PChar(sNF+Ext),GENERIC_WRITE,0,nil,D,FILE_ATTRIBUTE_NORMAL,0);
    if (ft=INVALID_HANDLE_VALUE)and(Overwrite) then exit;
    inc(n);
   until (ft<>INVALID_HANDLE_VALUE);
   sNF:=ExtractFileName(sNF)+#13+#10;
   WriteFile(ft,sNF[1],Length(sNF),DWord(t),nil);
   WriteFile(ft,Str[i],j-i,DWord(t),nil);
   if not(Str[j-1] in [#10,#13]) then sNF:=#13+#10+sNF;
   WriteFile(ft,sNF[1],Length(sNF)-2,DWord(t),nil);
   CloseHandle(ft);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var c:integer;
    s:string;
begin
 try
  c:=StrToInt(Edit1.Text);
 except
  c:=200;
 end;
 s:=Memo1.Lines.Text;
 SaveStr(s,'e:\L.iso',c,true);
end;

Автор: Serhik_z 18.6.2005, 03:42
Poseidon - Большое спасибо.
Вот только в последний сохраняемый файл не добавляет строку.

Автор: Poseidon 18.6.2005, 03:47
Serhik_z, посмотри код Гирдера. Я в нем не разбирался, т.к. уже позно smile
А насчет
Цитата(Serhik_z @ 18.6.2005, 03:42)
в последний сохраняемый файл не добавляет строку.
это да, ошибочка, одну строчку добавь в мой предыдущий код после 25 строки:
Код
List.Add('Последняя строка');// 


Автор: Serhik_z 18.6.2005, 04:26
Poseidon - Спасибо, Все получилось.

Код

function TForm2.SaveStringsToFiles(const AList: TStrings;
  ACountLines: Integer): Boolean;
var
i, x: integer;
List: TStrings;
FileName: string;// для добавления строк
begin
List:= TStringList.Create;
x:= 1;// Счетчик с 1го
FileName:= 'L'+IntToStr(x);
List.Add(FileName);
for i:= 0 to Alist.Count-1 do
  begin
  List.Add(AList.Strings[i]);
  if ((i+1) mod ACountLines = 0)and(i<>0)
  then
    begin
    List.Add('M20');// вот это добавили
    List.SaveToFile(FileName+'.iso');
    x:= x+1;
    FileName:= 'L'+IntToStr(x);
    List.Clear;
    List.Add(FileName+'');//Убрали +'iso' для L1 L2 ...
    end;
  end;
  List.Add('M20');// вот это добавили для последнего файла
List.SaveToFile(FileName+'.iso');
List.Free;
Result:= True;
end; 

Автор: Poseidon 18.6.2005, 09:15
Рад, что нашими общеми усилиями все получилось. Обращайся еще smile

Автор: Dynamic 19.6.2005, 06:12
Это не правильно было?
Код

procedure TForm1.Button1Click(Sender: TObject);
var cnt, i, idx, j: integer;
   fn: string;
begin
    cnt := StrToIntDef(Edit1.Text, 1);  // строк в куске
    idx := 1;     // счетчик файлов
    j := 0;       // позиция в Мемо
    with TStringList.Create do
    try
     while j <= Memo1.Lines.Count do
     begin
      Clear;
      fn := 'L' + IntToStr(idx); // имя файла
      inc(idx);
      Add(fn);   // добавляем имя файла в начало
      for i := j to j + cnt-1 do
       if i >= Memo1.Lines.Count then break else
         Add(Memo1.Lines[i]);
      inc(j, cnt);    // смещаем позицию в Мемо
      Add(fn);        // добавляем имя файла в конец
      SaveToFile(fn + '.iso');  // сохраняем
     end;
    finally
      Free;
    end;
end;

Автор: Serhik_z 19.6.2005, 09:18
А можно сделать так, чтоб последняя строка пронумеровывалась.
Как №123 текст последней стоки.

Автор: Poseidon 19.6.2005, 15:37
Цитата(Serhik_z @ 19.6.2005, 09:18)
А можно сделать так
Можно все! smile Только скажи, что значит "пронумеровалась"? Т.е. должен быть именно №123 или № строки?

Автор: Quadr0 19.6.2005, 16:55
...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)