Results 1 to 14 of 14

Thread: Tekst uitlezen uit een tekstfile in array en terugschrijven in een file

  1. #1

    Unhappy Tekst uitlezen uit een tekstfile in array en terugschrijven in een file

    Maak een applicatie om de regels van tekstfiles om te zetten naar hoofdletters.
    De tekstfiles mogen niet te lang zijn. Stel de grens op 100 regels.
    De applicatie bestaat uit één formulier waarop de volgende controls zijn aangebracht:
    ÔÇó een editbox, die de naam van de file bevat;
    ÔÇó een button Hoofdletters, die de hoofdletteromzetting uitvoert.
    Ontwerp de applicatie zodanig, dat bij het drukken op de button Hoofdletters de file regel voor regel
    wordt ingelezen in een string-array, waarna de strings in de array worden omgezet naar hoofdletters
    en dan weer naar de file worden geschreven. Als dit gebeurd is, wordt een messagebox "Ready"
    getoond.
    Zorg voor exception handling (try ... except ... end) zodat fouten worden afgevangen, bijv. een file die
    niet te openen is. Foutmeldingen worden ook middels messageboxes gegeven.

    Mijn procedure ziet eruit:
    Code:
    unit untLetterTabel;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
    
    procedure LeesUitFile (sTekst: String);
    
    
    implementation
    
    
    type
      TLettertabel = array ['A'..'Z'] of Integer;
    
    
    procedure LeesUitFile (sTekst: String);
    var
      tFile: Textfile;
      iIndex: Integer;
      cLetter: Char;
      ltLetter: TLettertabel;
    begin
      AssignFile (tFile, sTekst);
      try
      Reset (tFile);
      ReadLn (tFile, sTekst);
      Rewrite (tFile);
      while not Eof (tFile)
      do begin
        for iIndex := 1 to Length (sTekst)
        do begin
          cLetter := UpCase(sTekst[iIndex]);
          if cLetter in ['A'..'Z']
          then
            ltLetter[cLetter] := ltLetter[cLetter] + 1;
            WriteLn (tFile, cLetter)
        end
        end;
        CloseFile(tFile);
        ShowMessage ('Ready');
     except
      ShowMessage ('Bestand ' + sTekst + ' niet gevonden.')
     end
    end;
    end.
    Indien ik while nog Eof (tFile) eruit haal krijg ik geen foutmelding (Project Hoofdlettersomzetting.exe raised exception class EInOutError with message 'I/O error 104'. Process stopped), maar krijg in mijn tekst file vreemd Lay-out:
    T
    E
    S
    T

    Wat doe ik verkeerd? Hoe kan ik dit oplossen?

    Alvast bedankt.
    Last edited by Dees; 25-Feb-05 at 22:25.

  2. #2
    Waarom laad je het bestand niet in een stringlist, zet je dan in hoofdletters en schrijf het opnieuw weg?
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

  3. #3
    TScriptKiddie DiGi-Ben's Avatar
    Join Date
    Oct 2004
    Location
    Beek (lb). Neth. Uses: Delphi 2005 Architect Uses: Delphi 2006 Architect
    Posts
    817
    Ik zie dat je WriteLn in plaats van Write gebruikt. Dit zorgt ervoor dat iedere char op een nieuwe regel komt.
    "Some are wise, some are otherwise."

  4. #4

  5. #5
    Google weet dat een I/O error 104 betekend dat je bestand nog niet geopend is
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

  6. #6
    Het werkt inderdaad met Write ipv WriteLn:
    Code:
    unit untLetterTabel;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
    
    procedure LeesUitFile (sTekst: String);
    
    
    implementation
    
    
    type
      TLettertabel = array ['A'..'Z'] of Integer;
    
    
    procedure LeesUitFile (sTekst: String);
    var
      tFile: Textfile;
      iIndex: Integer;
      cLetter: Char;
      ltLetter: TLettertabel;
    begin
      AssignFile (tFile, sTekst);
      try
      Reset (tFile);
      ReadLn (tFile, sTekst);
      Rewrite (tFile);
      for iIndex := 1 to Length (sTekst)
      do begin
        cLetter := UpCase(sTekst[iIndex]);
        if cLetter in ['A'..'Z']
        then
          ltLetter[cLetter] := ltLetter[cLetter] + 1;
          Write (tFile, cLetter)
       end;
      CloseFile(tFile);
      ShowMessage ('Ready');
     except
      ShowMessage ('Bestand ' + sTekst + ' niet gevonden.')
     end
    end;
    end.
    Alleen moet ik controleren of er bestand bestaat. Dat moet ik aan de hand van:
    while not Eof (tFile)

    Waar moet ik deze dan plaatsen, zo dat geen foutmelding alweer komt dat de file niet geopend is?

  7. #7
    Controleren of een bestand bestaat doe je met de functie FileExists. Je plaats dat aan het begin van je procedure
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

  8. #8
    Quote Originally Posted by Henkie
    Controleren of een bestand bestaat doe je met de functie FileExists. Je plaats dat aan het begin van je procedure
    FileExists(sTekst);
    Alweer komt 'ie met de foutmelding en gaat daarna naar de regel
    Code:
    while not Eof (tFile)

  9. #9
    FileExists is een functie welke je dan best aanroept als een functie om zo uit de procedure te kunnen springen, en een boodschap dat het bestand niet bestaat
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

  10. #10
    TScriptKiddie DiGi-Ben's Avatar
    Join Date
    Oct 2004
    Location
    Beek (lb). Neth. Uses: Delphi 2005 Architect Uses: Delphi 2006 Architect
    Posts
    817
    FileExists geeft een boolean als result. Bestaat het bestand, dan geeft hij true, anders false. Dus je moet een if-statement maken.
    "Some are wise, some are otherwise."

  11. #11
    notice-itter SvG's Avatar
    Join Date
    Apr 2002
    Location
    's-Hertogenbosch
    Posts
    4,865
    ReWrite() betekend toch dat het bestand geleegd moet worden en dat je er nieuwe data in wilt gaan schrijven.. Dan vraag ik me af waarom je zo graag eof wilt gebruiken dat is nodig wanneer je het bestand gaat uitlezen.
    !

  12. #12
    TScriptKiddie DiGi-Ben's Avatar
    Join Date
    Oct 2004
    Location
    Beek (lb). Neth. Uses: Delphi 2005 Architect Uses: Delphi 2006 Architect
    Posts
    817
    Nee, ik denk niet dat hij het leeg maakt. Het geeft gewoon permissie om in het bestand te schrijven. Zie Hier
    Last edited by DiGi-Ben; 27-Feb-05 at 15:05. Reason: herformulatie
    "Some are wise, some are otherwise."

  13. #13
    Quote Originally Posted by DiGi-Ben
    Nee, ik denk niet dat hij het leeg maakt.
    Denk het wel
    If the file does not exist, it is created.

    If the file already exists, the contents are lost, and new data is added to the start.
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

  14. #14
    Senior Member Lodewijk's Avatar
    Join Date
    Apr 2004
    Location
    Netherlands
    Posts
    1,934
    Met Rewrite() herschrijf je de file (daar staat de engelse betekenis ook voor duh), dus de data die er dan in stond kan je er ook niet uit lezen. Ik zou zoals Henkie al suggeste, gewoon een stringlist hiervoor gebruiken.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •