Announcement

Collapse
No announcement yet.

ASCII #0 in einer Datei suchen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ASCII #0 in einer Datei suchen

    Hallo.<BR>
    <BR>
    Ich habe eine Textdatei, in der möglicherweise das ASCII-Zeichen #0 (NUL) vorkommt.<BR>
    Gibt es eine Möglichkeit die Datei danach zu durchsuchen?<BR>
    <BR>
    Wenn ich einen Buchstaben suche, kann ich mit einer Schleife den Text zeilenweise+zeichenweise durchsuchen.<BR>
    <BR>
    Geht so etwas auch mit solchen Zeichen wie #0?<BR>
    Danke im Voraus.<BR>
    <BR>
    MFG<BR>
    hgjank

  • #2
    Hallo,

    &gt;Geht so etwas auch mit solchen Zeichen wie #0?

    Ja - der folgende Auszug aus einem Beispielprojekt aus meinem Buch <i>Delphi Win32-Lösungen</i> (Seite 223 bis 226) demonstriert dies. Jedes Nullzeichen wird durch einen Zeilenwechsel ersetzt, wobei das Ende des Input-Datenblocks durch zwei aufeinanderfolgende Nullzeichen gekennzeichnet wird:
    <pre>
    <b>uses</b> Registry;
    <br>
    <b>resourcestring</b>
    cKEYNAME = <font color="#9933CC">'Software\OssiSoft\MULTI_SZ'</font>;
    cVALUENAME = <font color="#9933CC">'Testeintrag'</font>;
    <br>
    <b>procedure</b> TForm1.ButtonReadClick(Sender: TObject);
    <b>var</b>
    aRegKey : TRegistry;
    iSize : Integer;
    sTemp : <b>String</b>;
    iPos : Integer;
    bExit : Boolean;
    <b>begin</b>
    aRegKey := TRegistry.Create;
    <b>try</b>
    <b>with</b> aRegKey <b>do</b>
    <b>begin</b>
    RootKey := HKEY_CURRENT_USER;
    OpenKey(cKEYNAME, False);
    iSize := aRegKey.GetDataSize(cVALUENAME);
    <b>if</b> (iSize &gt; 0) <b>then</b>
    <b>begin</b>
    SetLength(sTemp, iSize);
    aRegKey.ReadBinaryData(cVALUENAME, sTemp[1], iSize);
    bExit := False;
    <b>repeat</b>
    iPos := Pos(#0, sTemp);
    <b>if</b> iPos &lt;&gt; 0 <b>then</b>
    <b>if</b> sTemp[iPos + 1] &lt;&gt; #0 <b>then</b>
    sTemp[iPos] := #13
    <b>else</b>
    bExit := True;
    <b>until</b> bExit;
    ListBoxRead.Items.Text := sTemp;
    <b>end</b>;
    <b>end</b>;
    <b>finally</b>
    aRegKey.Free;
    <b>end</b>;
    <b>end</b>;
    </pre&gt

    Comment


    • #3
      Hallo Herr Kosch.<BR>
      <BR>
      Danke für das Beispiel. Ich bräuchte doch noch etwas Hilfe.<BR>
      <BR>
      Mir ist noch nicht klar, wie ich meine Textdatei in das Beispiel einbinde.<BR>
      Die Textdatei liegt im Ordner "Daten" und hat den Namen "Test".<BR>
      <BR>
      Ich hoffe Sie können mir noch mal auf die Sprünge helfen.<BR>
      <BR>
      Danke.<BR>
      <BR>
      MFG<BR>
      hgjan

      Comment


      • #4
        du kannst die Textdatei mit einem objekt namens TStringList Öffnen ... eine tstringlist enspricht einem mehrzeiligen text ....

        BSP :

        <PRE>
        var
        AStringList : TStringList;//die textdatei als objekt
        Zeile,Zeichen : Integer;//zähler für durchsuchen der textdatei
        einzelnesZeichen : Char;//das ist dann das einzelne zeichen aus dem text das du dann vergleichen kannst ...
        begin
        AStringList := TStringList.Create;//createn
        AStringList.LoadFromFile(Dateiname);//textdatei laden
        for Zeile := 0 to AStringList.Count-1 do//jede zeile durchgehen
        begin
        for Zeichen := 0 to Length(AStringList.Strings[Zeile]) do//jedes zeichen der zeile durchgehen
        begin
        einzelnesZeichen := AStringList.Strings[Zeile][Zeichen];//das einzelne zeichen aus dem text holen
        //hier musst du dann vergleichen ....
        end;//for Zeichen := 0 to Length(AStringList.Strings[Zeile]) do
        end;//for Zeile := 0 to AStringList.Count-1 do
        AStringList.Free;//freigeben
        </PRE&gt

        Comment


        • #5
          Hallo.<BR>
          <BR>
          Wenn ich das Zeichen #0 in eine Datei schreibe und diese dann mit MS-Word öffne, steht an der Stelle ein kleines Kästchen.<BR>
          Ich habe Orginaldateien, in denen dieses Zeichen angeblich auch steckt.<BR>
          Öffne ich diese, gibt es nur Leerzeichen an den entsprechenden Stellen.<BR>
          <BR>
          Mache ich mir das Setzen des Zeichen zu einfach?<BR>
          <BR>
          write(Datei,'Text' + #0 + 'Text' + #13#10);<BR>
          <BR>
          Ich hoffe Ihr könnt mir nochmal helfen.<BR>
          <BR>
          MFG<BR>
          hgjan

          Comment


          • #6
            an sich ist das so rcihtig .... aber bist du dir sicher das was du in eienm anderen textdatei als leerzeichen liest auch eien #0 ist ????

            mal so als fragen ... warum willst du ein #0 in die datei schreiben ???????? vieleicht´gibt es ja einen anderen/besseren weg ???

            Comment


            • #7
              Hallo.<BR>
              <BR>
              Es muß #0 sein (genormte Schnittstelle).<BR>
              Wenn ich die Orginaldatei in Word öffne, und ein Zeichen (#0) durch ein Leerzeichen ersetze, sieht es zwar gleich aus aber es geht nicht mehr.<BR>
              Kopiere ich dieses Zeichen von einer anderen Stelle dort hin, wo ich eben das Leerzeichen gesetzt habe, geht es wieder.<BR>
              In der Beschreibung der Schnittstelle steht, daß die Felder mit Leerzeichen aufzufüllen sind.<BR>
              Unbenutzte Felder sind mit "Binär Null" aufzufüllen.<BR>
              <BR>
              Meine Aufgabe ist es für einen Hersteller in seiner Datei 2 Felder zu tauschen.<BR>
              Ein Feld hat 15 Zeichen und das andere 20 Zeichen.<BR>
              Ich darf das längere einfach abschneiden, und muß das kürzere auffüllen.<BR>
              <BR>
              Lese ich die Zeichen, die laut Beschreibung "Binär Null" sein sollen, mit write ein, so sind es Leerzeichen???<BR>
              Oder erkenne ich dieses "Binär Null" mit write nicht richtig???<BR>
              <BR>
              Vielleicht hast du noch eine Idee.<BR>
              Ich versuche es weiter.<BR>
              <BR>
              Danke<BR>
              <BR>
              MFG<BR>
              hgjan

              Comment


              • #8
                Notlösung ist fertig!<BR>
                <BR>
                Ich habe jetzt an die Stelle, die auffüllen muß, ein Zeichen hinkopiert.<BR>
                Das Zeichen stammt aus einem Reservefeld, welches laut Beschreibung mit "Binär Null" aufgefüllt sein müsste.<BR>
                <BR>
                Damit funktioniert es!!!<BR>
                Ich aber kann nicht davon ausgehen, das dieses Feld in Zukunft leer bleibt.<BR>
                Das heißt, ich muß dieses Zeichen auch so erzeugen können.<BR>
                <BR>
                Also falls noch jemand ein Idee hat, wäre ich sehr dankbar.<BR>
                <BR>
                <BR>
                Ersteinmal Danke für die Hilfe.<BR>
                <BR>
                MFG<BR>
                hgjan

                Comment


                • #9
                  hhmmmm meines wissens nach ist #0 bei zeichenketten das zeichen dasd das ende der zeichenkette markiert ...

                  du könntest dir mit

                  APChar = PChar(QuellString);

                  dir einen pointer auf den string holen ....

                  und dann das was null werden mit FillChar auf null setzten ....
                  &#10

                  Comment

                  Working...
                  X