Jak dodać tekst do plików amorficznych?

0

Piszę program do tworzenia jednego pliku z wielu, jednak przed każdym plikiem ma być nagłówek i jego nazwa, w celu późniejszego rozdzielenie (archiwizator z epoki kamienia ;-) )

 
       s := 'nameprogramarchive'+extractfilename(files[i]); //tworzenie nagłówku i nazwy (files : Tstrings;   ze ścieżkami plików)

          assignfile(f2, files[i]); // f2 : file   ;    i : integer
          reset(f2, 1);      // otwieranie pliku

          BlockWrite(f1, s, sizeof(s));    //dodawanie tekstu do pliku

Próbowałem też zamiast stringa (s) używać pchar, lecz też nie działało. Zamiast dodać normalny tekst dodaje jakieś "arabskie robaczki" (tzn, nie wiadomo co) (na stringu i pchar).

2

Zapisywanie łańcuchów znaków do plików amorficznych wiąże się po piersze z uprzednim zapisem długości łańcucha, a po drugie - BlockWrite oczekuje podania konkretnego znaku, od którego zapisany zostanie bufor (a dokładniej niejawnie adresu znaku) oraz wielkości bufora; A że SizeOf zmiennej łańcuchowej zawsze zwróci rozmiar wskaźnika - użyć trzeba funkcji Length;

Natomiast przy odczycie najpierw odczytujesz długość łańcucha w pliku, następnie ustawiasz długość zmiennej łańcuchowej i wczytujesz bufor za pomocą BlockRead;

Jeżeli łańcuchy zapisywane do plików zawsze mają taki sam rozmiar, to zapis długości łańcuchów pomiń, ale pamiętaj o tym, w jaki sposób podaje się łańcuchy do zapisu/odczytu przez wymienione procedury;

Dawno już nie używałem plików amorficznych, ale z tego co pamętam to tak powinny wyglądać zapis i odczyt danych; Ewentualnie zastanów się nad klasą strumienia TFileStream i z niej korzystaj do operacji na plikach amorficznych;
____Edit: Sprawdziłem poniższy kod i działa prawidłowo:

{$APPTYPE CONSOLE}

  procedure SaveStringToFile(const AFileName, AData: AnsiString);
  var
    fOutput: File;
    intDataSize: Integer;
  begin
    AssignFile(fOutput, AFileName);
    ReWrite(fOutput, 1);
    try
      intDataSize := Length(AData);
      BlockWrite(fOutput, intDataSize, SizeOf(Integer));
      BlockWrite(fOutput, AData[1], intDataSize);
    finally
      CloseFile(fOutput);
    end;
  end;

  procedure LoadStringFromFile(const AFileName: AnsiString; out AData: AnsiString);
  var
    fInput: File;
    intDataSize: Integer;
  begin
    AssignFile(fInput, AFileName);
    Reset(fInput, 1);
    try
      BlockRead(fInput, intDataSize, SizeOf(Integer));
      SetLength(AData, intDataSize);
      BlockRead(fInput, AData[1], intDataSize);
    finally
      CloseFile(fInput);
    end;
  end;

const
  DATA_FILENAME = 'C:\File.dat';
var
  strData: AnsiString;
begin
  Write('Type string to save: ');
  ReadLn(strData);

  SaveStringToFile(DATA_FILENAME, strData);
  strData := '';
  LoadStringFromFile(DATA_FILENAME, strData);

  Write('Loaded string: "', strData, '"');
  ReadLn;
end.

Działa prawidłowo także dla pustych łańcuchów - nie trzeba dodawać specjalnych zabezpieczeń.

1 użytkowników online, w tym zalogowanych: 0, gości: 1