Toon posts:

[Delphi]Probleem met schrijven naar een textfile

Pagina: 1
Acties:

Verwijderd

Topicstarter
ik heb de volgende code om naar een textfile te schrijven:


code:
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
procedure TForm1.writeToASCII(personName, queryKey, queryName, startText, queryResult, endText: String);
var
  AFile: string;
  LogFile: TextFile;
  bQueryExists: Boolean;
begin
  AFile := FileServerLoc + personName + '.txt';
  AssignFile(LogFile, AFile);
  if FileExists(AFile) then
    begin
      bQueryExists := checkLineExists(AFile, queryKey);
      showmessage(BoolToStr(bQueryExists));
      if bQueryExists = False then
        begin
          append(LogFile);
          WriteLn(LogFile, queryKey + queryName + startText + endText);
        end;
    end
    //if file doesn't exist then create a new file and open it (rewrite)
  else //don't check if line exists, file has just been made, so it's empty, just add the line
    begin
      rewrite(LogFile);
      WriteLn(LogFile, queryKey + queryName + startText + endText);
    end;
  CloseFile(LogFile);
end;


werkt allemaal prima met schrijven enzo, maar nu heb ik er een check op staan: "checkLineExists" om te kijken of de regel die ik wil schrijven al bestaat in het betreffende textbestand. Die test geeft gewoon een boolean terug.

Geeft ie nu true terug dan begint het probleem, de append wordt dan namelijk niet uitgevoerd en hij gaat meteen naar de closefile functie, en op dat moment geeft ie dus een i/o error 103. Dat komt dus naar mijjn mening omdat ie een schrijfactie of zoiets verwacht (die append of die rewrite), maar die niet krijgt. Met welk commando kan ik het textbestand in een toestand krijgen dat ik hem wel weer kan sluiten zonder error? Of kan ik ook gewoon op de else van die
code:
1
      if bQueryExists = False then
zetten
code:
1
append(LogFile);


Dus dan zou je deze code krijgen:
code:
1
2
3
4
5
6
7
8
9
10
  if FileExists(AFile) then
    begin
      bQueryExists := checkLineExists(AFile, queryKey);
      if bQueryExists = False then
        begin
          append(LogFile);
          WriteLn(LogFile, queryKey + queryName + startText + endText);        end
      else
        append(LogFile);
    end

Maar ik vraag me dus af of dat zomaar mag, een file op append zetten en vervolgens weer sluiten

  • JozyDaPozy
  • Registratie: December 2002
  • Laatst online: 13-05 14:00
Ik vind je vraag vrij onduidelijk maar misschien heb je hier wat aan:

Een textbestand open je in delphi door:

AssignFile
Append / Rewrite / Reset
[..]
CloseFile

Ik heb sterk de indruk dat jij in de functie checkLineExist het bestand inleest, terwijl je in je hoofdfunctie dan al de AssignFile hebt aangeroepen...

Volgens mij kun je dit beter boven je AssignFile doen..

ik zou dus zoeiets doen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var
    f : textfile;
begin
    if FileExists(fn) then
    begin
        if not KomtRegelVoor(fn,'blablabla') then
        begin
            AssignFile(f,fn);
            Append(f,fn);
            Writeln(f,''blablabla');
            CloseFile(f);
        end;
    end
    else
    begin
        AssignFile(f,fn);
        Rewrite(f,fn);
        Writeln(f,''blablabla');
        CloseFile(f);
    end;
end;

[ Voor 5% gewijzigd door JozyDaPozy op 20-12-2003 18:47 ]


  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Post de code eens van checkLineExists() ?

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 26-05 11:18

alienfruit

the alien you never expected

Ten goede orde waarom maak je niet gebruik van TFileStream om tekst naar een bestand te schrijven? Dat is namelijk de manier zoals Borland het graag wil :) Ik zal reden voering straks nog wel op zoeken maar het heeft te maken met dccil.

Delphi:
1
2
3
4
5
6
7
8
9
10
11
var TextFile: TFileStream;
    aLine: string;
begin
  TextFile := TFileStream.Create( 'C:\debug.log', fmCreate or fmOpenWrite );
  try
    aLine := 'constructive debug log';
    TextFile.Write( aLine[1], Length( aLine ) );
  finally
    TextFile.Free;
    TextFile := nil;
  end;

[ Voor 44% gewijzigd door alienfruit op 20-12-2003 19:29 ]


  • JozyDaPozy
  • Registratie: December 2002
  • Laatst online: 13-05 14:00
Borland vind een TextFile ook leuk hoor!

Is voor puur tekst-bestanden wel zo handig, aangezien je een makkelijke readln en writeln kan gebruiken..

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Een AssignFile opent geen file, maar initializeerd de interne file variable. Zolang je nog geen Reset, Rewrite of Append gedaan hebt op dat bestand hoef je m niet te sluiten. De oplossing is dus CloseFile niet aan te roepen als je bestand nog niet eens open is. Je zou ook best Append moeten doen op een bestand en m dan meteen sluiten, maar das een beetje verspilling. Zorg gewoon dat je je if structuur goed maakt. Bijvoorbeeld zoals jozy2002 voorsteld.

We adore chaos because we like to restore order - M.C. Escher


  • DiGuru
  • Registratie: April 2003
  • Laatst online: 05-09-2008
Het is het eenvoudigste om met IOResult de zaak te sturen.


code:
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
procedure Log(LogFile, s: string);
var
  f: TextFile;
begin
  if LogFile <> '' then
  begin
    {$I-}
    if FileExists(LogFile) then
    begin
      AssignFile(f, LogFile);
      Append(f);
    end
    else
    begin
      AssignFile(f, LogFile);
      Rewrite(f);
    end;
    if (IOResult = 0) then
    begin
      Writeln(f, s);
      Flush(f);
      CloseFile(f);
    end;
    {$I+}
  end;
end;


Je moet na de Append() of Rewrite() de status checken. En daartoe moet je met {$I-} de exceptionhandler afzetten.
Pagina: 1