 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Chris
Anmeldungsdatum: 19.01.2009 Beiträge: 3
|
Verfasst am: 19.01.2009, 13:11 Titel: LOC Beispielcode aus der Befehlsreferenz |
|
|
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 |  |
|
Nach oben |
|
 |
frebas
Anmeldungsdatum: 20.06.2008 Beiträge: 245
|
Verfasst am: 19.01.2009, 14:14 Titel: |
|
|
Für das zweite A musst du nur dir erste DO...LOOP Schleife nochmal ausführen. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 19.01.2009, 14:24 Titel: |
|
|
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 |
|
 |
Chris
Anmeldungsdatum: 19.01.2009 Beiträge: 3
|
Verfasst am: 19.01.2009, 17:17 Titel: |
|
|
Hallo PuppetMaster,
Dein Programm ist gut dokumentiert daher werde ich die Zusammenhänge bald verstehen.
Danke nochmal !
 |
|
Nach oben |
|
 |
Chris
Anmeldungsdatum: 19.01.2009 Beiträge: 3
|
Verfasst am: 24.01.2009, 02:05 Titel: |
|
|
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
 |
|
Nach oben |
|
 |
|
|
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.
|
|