Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

LOC Beispielcode aus der Befehlsreferenz

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Chris



Anmeldungsdatum: 19.01.2009
Beiträge: 3

BeitragVerfasst am: 19.01.2009, 13:11    Titel: LOC Beispielcode aus der Befehlsreferenz Antworten mit Zitat

Hallo zusammen,

Das folgende Beispiel aus der Befehlrefernz für LOC findet die erste Stelle in einer Datei an welcher sich das ASCII Zeichen A befindet und gibt die Positionsnummer des Byte's an.
Aber wie gesagt nur die erste Stelle.

Wie kann man den Code so erweitern dass nicht nur die erste Stelle sondern alle Stellen angezeigt werden wo das ACSII Zeichen A vorkommt ?
z.B.

In dieser Datei kommt 'A' an Byte 5,7,15,23 vor.

perfekt wäre es wenn die Anzeige nicht nur auf A beschränkt wäre sondern alle ASCII Zeichen sucht und anzeigt.
z.B.

a kommt an Byte 2,6,19 vor
b kommt an Byte 2,8,22, 56 vor
.... usw.

danke schon mal im voraus !

Gruß,

Chris



Code:
Dim As UByte dummy, DNr=FreeFile
OPEN "mydata.ext" FOR BINARY AS #DNr

DO
   GET #DNr, , dummy
   IF dummy = ASC("A") THEN EXIT DO
LOOP UNTIL LOC(DNr) = LOF(DNr)

firstPos = LOC(DNr)
If firstPos = LOF(DNr) THEN firstPos = 0
CLOSE #DNr

IF firstPos THEN
   PRINT "In dieser Datei kommt 'A' zum ersten ";
   PRINT "Mal an Byte " &firstPos &" vor."
ELSE
   PRINT "In dieser Datei kommt 'A' nie vor."
END IF
lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
frebas



Anmeldungsdatum: 20.06.2008
Beiträge: 245

BeitragVerfasst am: 19.01.2009, 14:14    Titel: Antworten mit Zitat

Für das zweite A musst du nur dir erste DO...LOOP Schleife nochmal ausführen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 19.01.2009, 14:24    Titel: Antworten mit Zitat

Gibt die alle positionen aller zeichen aus:

Code:

Type ASCII_Pos_Type                     'Eine Linked List erstellen
   V_Next as ASCII_Pos_Type Ptr         'Das ist ein Pointer auf die selbe Typestruktur (die linked list ist damit komplett)
   V_Pos as UInteger                  'Der Speicher, welcher die Position des zeichens enthält
End Type

Dim PositionsF(255) as ASCII_Pos_Type Ptr   'Der Anfang der Linked list
Dim PositionsL(255) as ASCII_Pos_Type Ptr   'Das letzte element in der Linked list


Dim XFilePath as String = Command()         'Commandoeingabe als Pfad nutzen
If (Right(XFilePath, 1) = "/") or (Right(XFilePath, 1) = "\") Then Print "Datei ist ein Vezeichniss!": End -1      'Prüfen ob der Pfad kein Verzeichniss ist
If Dir(XFilePath, -1) = "" Then Print "Datei nicht gefunden!": End -1                                    'Prüfen ob der Pfad eine Datei ist
Dim XFN as UInteger = FreeFile                                                                  'Eine Freie Dateinummer einhohlen
If Open(XFilePath for Binary as #XFN) <> 0 Then Print "KOnnte Datei nicht öffnen!": End -1                     'Die Datei öffnen
Dim D as String                        'Einen String für die Daten aus der Datei erstellen
Dim MX as UInteger = Lof(XFN)            'Wir speichen die Grösse der Datei in eine Variable. (Das beschleunigt den ablauf ein wenig, da wir später ein erneutes LOF sparen)
Dim XBlockSize as UInteger = 6000         'Wir möchten die Datei in 6KByte schritten lesen (ist schnell genug und blockiert das prog bei grossen datein nicht)
Dim Y as UInteger                     'Temporäre schleifenvariable
Dim X as UInteger                     'Temporäre schleifenvariable
D = Space(XBlockSize)                  'Wir erstellen einen Speicher der die grösse von BlockSize hat, um die daten einlesen zu können
For X = 1 to MX step XBlockSize            'Wir gehen die datei in 'XBlockSize' schritten druch
   If MX - X < XBlockSize Then D = Space(MX - X + 1)   'sind wir am ende, und ist die restliche grösse der daten kleiner als die BLockSize, dann verändern wir die speichergrösse (anpassen)
   Get #XFN, X, D                     'Die Daten aus der datei in die variable einlesen
   For Y = 1 to Len(D)                  'wir gehen jedes zeichen durch
      If PositionsL(D[Y - 1]) <> 0 Then   'Der ASCII Wert des zeichens ... Asc(Mid(D, Y, 1)) ist das selbe wie D[Y - 1] .. ist der index des Arrays für die 255 unterschiedlichen zeichen
         PositionsL(D[Y - 1])->V_Next = CAllocate(SizeOf(ASCII_Pos_Type))   'Wir erstellen einen neuen Speicher für ein neues element in der linked list
         PositionsL(D[Y - 1]) = PositionsL(D[Y - 1])->V_Next               'das neue element machen wir zum letzten element
      Else                                             'da die liste noch keinen eintrag hat, müssen wir dieses zuerst "inizialisieren"
         PositionsL(D[Y - 1]) = CAllocate(SizeOf(ASCII_Pos_Type))   'Dazu wird ein neues element erstellt
         PositionsF(D[Y - 1]) = PositionsL(D[Y - 1])               'und dieses element auch als erstes abgespeichert. Sonst verliehren wir die Elemente.
      End If
      PositionsL(D[Y - 1])->V_Pos = X + (Y - 1)      'Die Position des zeichens berechnen udn abspeichern
   Next
Next
close #XFN                           'Datei schliessen



'Jetzt können wir die zeichenpositionen ausgeben
Print "=[ASCII-POSITIONEN]="
Print "----------------------------"
Print
Dim XPtr as ASCII_Pos_Type Ptr            'Eine temporäre variable die uns hilft die LinkedList abzuarbeiten
For X = 1 to 255                     'Alle möglichen Zeichen durchgehen (ASCII 0 wurde weg gelassen)
   Print "ASCII: "; X                  'Welches zeichen zeigen wir an?
   Print
   XPtr = PositionsF(X)               'Den Pointer auf das erste zeichen in unsere temp-variable kopieren
   Do Until XPtr = 0                  'ist der Pointer = 0 Dann verlassen wir die schleife
      Print XPtr->V_Pos; "  ";         'ansonsten geben wir die position des zeichens aus
      XPtr = XPtr->V_Next               'und setzen den Pointer auf das nächste element in unsere temp-variable
   Loop
   Print
   Print "----------------------------"
Next


For X = 1 to 255                     'zum schluss müssen wir alle erstellten Elemente auch wieder löschen (sonst gibt es Speicherüberläufe)
   Do Until PositionsF(X) = 0            'Selbes verfahren wie beid er ausgabe, nur das hier eine variable gespart wird.
      PositionsL(X) = PositionsF(X)->V_Next   'nächstes element wird zwischengespeichert
      DeAllocate(PositionsF(X))            'das aktuelle wird gelöscht
      PositionsF(X) = PositionsL(X)      'das nächste als aktuelles element setzen
   Loop
Next

End 0                              'Fertig



MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]


Zuletzt bearbeitet von ThePuppetMaster am 24.01.2009, 02:54, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Chris



Anmeldungsdatum: 19.01.2009
Beiträge: 3

BeitragVerfasst am: 19.01.2009, 17:17    Titel: Antworten mit Zitat

Hallo PuppetMaster,

Dein Programm ist gut dokumentiert daher werde ich die Zusammenhänge bald verstehen.

Danke nochmal !

happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Chris



Anmeldungsdatum: 19.01.2009
Beiträge: 3

BeitragVerfasst am: 24.01.2009, 02:05    Titel: Antworten mit Zitat

Möchte mich hiermit nochmal offiziell bei ThePuppetMaster bedanken.
Er hat viele Fragen (per pn) von mir sehr ausführlich und informativ beantwortet.

Eine echte Bereicherung für das FreeBasic Forum.

Ein ehrliches DANKE PuppetMaster.


Gruß,

Chris

lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz