 |
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 |
General
Anmeldungsdatum: 26.11.2006 Beiträge: 149
|
Verfasst am: 19.02.2007, 15:28 Titel: Dateilänge |
|
|
also es geht mir um folgendes, gehe wir mal davon aus ich habe in einer datei 8 einträge und ich möchte eine schleife nur über diese 8 einträge laufen lasse. weil wenn ich do until eof(1) mache oder while not eof(1) dann haut das net so ganz hin ich hab au schon was anders probiert hier ma der code
Code: |
dim as string lesen(1 to 999)
dim as integer i,punkte,neupunkte
input"Welche Punktzahl",punkte
open"liste.txt" for append as #1
print #1, punkte
close #1
open"liste.txt" for input as #1
for i=1 to len(lesen)
line input #1, lesen(i)
print lesen(i)
print len(lesen)
next
close #1
sleep
|
also wenn ich das so mache da macht der mir die schleife viel zu lang ich will die ja nur über die vorhanden einträge haben |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 19.02.2007, 16:17 Titel: |
|
|
Ich weiß nicht, ob's nur mir so geht, aber: irgendwie ist mir jetzt nicht klar, was du eigentlich willst?
Wenigenst ein bisschen geordnet und ein bisschen Interpunktion...  _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 19.02.2007, 16:24 Titel: |
|
|
Ich glaube, er will das Zeilenweise einlesen, und am ende die Do Loop / For Next schleife verlassen.
Code: |
for ...
'Dein code
If Eof(1) Then Exit For
next
|
alternativ kannst du auch
Code: |
for X = 1 to Eof(1)
'...
next
|
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Zuletzt bearbeitet von ThePuppetMaster am 19.02.2007, 17:05, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
General
Anmeldungsdatum: 26.11.2006 Beiträge: 149
|
Verfasst am: 19.02.2007, 16:26 Titel: |
|
|
ok pass auf wenn ich eine Datei öffne per open und dem ganzen spass. So dann lese ich die datei ein aber ich möcte die Datei nur so lange einlesen wie der inhalt da drinne ist. Nur ich hab es schon mit viele möglichkeiten probiert, aber ich weiß net wie und die möglichkeiten die ich probiert habe gehe och net. daher meine frage könnt ihr mir helfen.Hoffe jetzt ist klar was ich meine
Code: |
dim as string lesen(1 to 999)
dim as integer i,punkte,neupunkte
input"Welche Punktzahl",punkte
open"liste.txt" for append as #1
print #1, punkte
close #1
open"liste.txt" for input as #1
for i=1 to eof(1)
line input #1, lesen(i)
print lesen(i)
print len(lesen)
next
close #1
sleep |
so also an dem beispiel will ich es mir verdeutlichen zuerst schreibe ich ein haufen Zahlen in die datei, danach sollen diese zahlen wieder ausgelesen werde mit inhalt und einfach für mich die länge des ausglesen(ich hoffe das geht so)
so kann mir daran einer erklären ob es so geht oder eher net |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 19.02.2007, 16:29 Titel: |
|
|
öm .. verstehe ich das richtig, das du:
1. Datei öffnen
2. Daten-Teil einlesen / Diesen eingelesenen Datenteil aus der Datei extrahieren (löschen)
3. Datei schliessen
(Laut deiner Erklärung) machen willst ??
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
General
Anmeldungsdatum: 26.11.2006 Beiträge: 149
|
Verfasst am: 19.02.2007, 16:37 Titel: |
|
|
nicht ganz, ich will
1.) Datei öffnen
2.) Datei-Teil einlesen/Ganze Datei löschen(oder kann mir einer sagen wie man den inhalt einer datei entfernt)
3.) Diesen Datei-Teil umändern und in die Datei wiederreinschreiben
so will ich das machen |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 19.02.2007, 16:43 Titel: |
|
|
WOW ... also .. sagen wir es mal so .. Es geht, aber der Aufwand, der dafür betrieben werden muss, ist deinem Vorhaben warscheinlich nicht zu rechtfertigen.
Lies die Datei ganz einfach ein, lösch sie danach, und schreib sie neu, das spart dir zeit, und geht schneller, als wenn du die daten ändern willst.
AUSER, du liest die Daten ein, erstellst dir ein Point-Array, in dem du die Positionen der zu ändernden stellen speicherst, diese nach dem vollständigem einlese-Durchlauf mit den Längen der neuen Werte hinzu rechnest, die gesammte neue länge als endmarke mit der API Funktion ... *grübel* SetEOF oder so ... festlegst, den dateninhalt dann von hinten her umschiebst, und die ArrayPunkte als Markierungen für einzufügende Datenpunkte nutzt.
Jaaaa, dann ist es möglich .. aber, wie gesagt, der aufwand rechnet sich sicher nicht, und schon garnicht bei kleinen Datein .. 1MB is schnell geschrieben ...
[nachtrag:0]
Sie es mal so ... wenn du eine neue Datei öffnest, dann Daten hinein schreibst, schreibst du sozusagen an das Ende der neuen Datei (da sie ja 0Byte gross ist) .. Das FileManagment erweitert dann (netterweise) das Dateiende um die länge der hinzugefügten daten. Wenn du nun aber Daten IN einer Datei änderst, dann überschreibst du nur die vorhandenen Daten. Du müstest also den rest abschneiden, deine änderung vornehmen, und den Rest wieder anhängen. Allerdings ist der Speicheraufwand enorm hoch, und die Zeitliche aufwand warscheinlich nicht mehr messbar (was sicher übertrieben ist, aber passt sehr gut, da es SEHR SEHR lang dauert, im vergleich, das einfach neu zu schreiben)
[nachtrag:1]
Code: | Private Declare Function SetEndOfFile Lib "kernel32" (ByVal hFile As Long) As Long |
dafür is dann (VB-Code)
Code: |
Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
Private Const FILE_SHARE_READ = &H1
Private Const OPEN_EXISTING = &H3
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function SetEndOfFile Lib "kernel32" (ByVal hFile As Long) As Long
Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Function XSetEOF(V_FilePathName as string, V_FileLen as long) as Boolean
XSetEOF = False
if V_FileLen < 0 then Exit Function
Dim FN as Long
FN = CreateFile(V_FilePathName, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ, ByVal 0, OPEN_EXISTING, 0, 0)
If FN = -1 Then Exit Function
SetFilePointer FN, V_FileLen, 0, 0
SetEndOfFile FN
CloseHandle FN
XSetEOF = True
|
nötig
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 19.02.2007, 17:55 Titel: |
|
|
??
Wieso Aufwand?
Da gibs doch nen netten Open-Mode, der das erledigt...
Also nich append, sondern output::
Offizielle, Deutschsprachige Hilfedatei hat Folgendes geschrieben: | OUTPUT
Typ: Schlüsselwort
Kategorie: Datei
Wird benutzt mit OPEN verwendet, um Daten in eine Datei zuschreiben.
Vorsicht: Wenn Sie eine bereits bestehende Datei FOR OUTPUT öffnen, wird sie gelöscht und neu angelegt!
Siehe auch:OPEN,INPUT (Dateimodus),WRITE #, PRINT # |
|
|
Nach oben |
|
 |
General
Anmeldungsdatum: 26.11.2006 Beiträge: 149
|
Verfasst am: 19.02.2007, 18:04 Titel: |
|
|
ja ebend das dachte ich och, denn ich glaube das was ich machen is relativ mit wenig aufwand verbunden. ich will doch nur eine datei öffnen dann das alles einlesen was drinne steht und nicht mehr, also sozusagen nur bis zum letzten EINTRAG nich bis zum ende der datei. dann wird die datei gelöscht.Danach geht es in meinem program weiter und dann soll einfach wieder nur das vorher eingelesene mit ein paar änderungen wieder in die datei geschrieben werde.Aber dazu brauche ich eure hilfe denn ich weiß net wie ich nur den teil aus eienr datei einlesen kann der drinne steht.Mache ich es mit einer for schleife geht mir das eingelesene zu weit.Mit einer do until eof geht es au zu weit, daher meine frage an euch ??? |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 19.02.2007, 18:25 Titel: |
|
|
PMedia hat Folgendes geschrieben: | ??
Wieso Aufwand?
Da gibs doch nen netten Open-Mode, der das erledigt...
Also nich append, sondern output:: |
Das geht schon, allerdings überschreibt man damit bestehenden Text in einer Datei. Wenn man Daten hinzufügen / ändern möchte, dann ist das nicht funktionsfehig.
Mal ein Beispiel:
Zitat: | Das hier ist ein kleiner Test-Text in der Datei FooBar |
Um nun Daten an zu hängen nehme man die Output methode udn schreibe daten an das Ende der Datei
Code: | Put #1, EOF(#1), "Neuertext123" | Ergibt:
Zitat: | Das hier ist ein kleiner Test-Text in der Datei FooBarNeuerText123 |
Soll nun ein Teil des Texts geändert werden, z.B. das Wort "kleiner" durch "NeuerText123" ersetzen, dann passiert folgendes: (17 = Startpunkt ds wortes "kleiner")
Code: | Put #1, 17, "NeuerText123" | Ergibt:
Zitat: | Das hier ist ein NeuerText123-Text in der Datei FooBar |
Es wird der Bereits vorhandene Text überschrieben.
Um das zu verhindern sind 2 Möglichkeiten vorhanden.
1. Datei Einlesen, Daten bearbeiten, Datei Löschen (oder neue parallel anlegen, und manipulationen dort neu schreiben), Datei neu schreiben
2. Datei Einlesen, Daten bearbeiten, udn die zu ändernden Positionspunkte in ein Array schreiben, Neue Länge berechnen (Wenn die Datei grösser wird, neues Dateiende festlegen), Datei mit geänderten Werten manipulieren, und überschüssige Daten verschieben, Datei schliessen.
Bei Grösseren Datein, die nur einen Wert ändern, kann das so gemacht werden, bei mehreren werten, und oder kleiner werdenden Datein, muss ein Swing-Algo genutzt werden
1. Datei Grösse anpassen (EOF + Len("NeuerText123") - len(<extrakt>))
2. Daten verschieben
3. Daten überschreiben
Code: |
0. >Das hier ist ein kleiner Test-Text in der Datei FooBar<
1. >Das hier ist ein kleiner Test-Text in der Datei FooBar <
2. >Das hier ist ein kleiner Test-Test-Text in der Datei FooBar<
3. >Das hier ist ein NeuerText123 Test-Text in der Datei FooBar<
|
Beides hat vor und nachteile. Die vorteile liegen darin, das man Grosse datein nicht duplizieren muss, um die zu ändern, der nachteil, das es langsam, code-intenv und zeitrauben ist.
@General
Erklär doch mal schritt für schritt, was du geanu machen willst, denn: ich glaub, ich hab dich immer noch nicht so ganz verstanden. Beschreib man das Problem, das du mit dem Programm lösen musst. Was für Daten sind in der Datei, was willst du auslesen, bzw. was soll dann in der Variable stehen, was möchtest du zurück schreiben, wie muss die datei danach aussehen?
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
General
Anmeldungsdatum: 26.11.2006 Beiträge: 149
|
Verfasst am: 19.02.2007, 18:31 Titel: |
|
|
ne ich glaube du weißt nich was ich direkt meine, aber ich will ja die daten net an andere ranhängen, sondern.
ich lese meinetwegen 10 zahlen aus einer datei ein(hier muss ich daher wissen wie man nicht bis zum ende der datei ließt sondern bis zum ende der 10 zahlen) so diese 10 zahlen hebe ich mir auf. dann kommt in meinem programm ein punkt wo ich einer dieser 10 zahlen beliebig ändere und an ihrer alten stelle wieder abspeichern will. So diese 10 zahlen werden wie gesagt aufgehoben und dann wird die alte datei gelöscht und es wird eine neue datei mit dem selben namen wieder anglegt. und in diese datei sollen dann die 10 zahlen, und in diese 10 zahlen enthält sich an einer bestimmten stelle die geänderte zahl. Das soll das Prinzip sein, einfach auslesen,löschen, alte ausgelsen zahlen ändern und wieder in ne neue datei einschreiben. Hoffe das war verständlich |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 19.02.2007, 18:45 Titel: |
|
|
General hat Folgendes geschrieben: | Hoffe das war verständlich | Jo
Noch ein paar Fragen ... Wodurch erkennst du, wenn du die 10 Zahlen eingelesen hast? ... Poste doch einmal ein Format der Datei, damit man das mal sehen kann, was du genau meinst.
Ansonsten kannst du die Schleife ja auch einfach verlassen, wenn du genug gelesen hast, und must nicht den rest durchlaufen lassen.
Code: | For x = 1 to 100
If X = 10 then Exit For 'Verlässt die Schleife nach 10 Durchläufen
next |
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
General
Anmeldungsdatum: 26.11.2006 Beiträge: 149
|
Verfasst am: 19.02.2007, 18:56 Titel: |
|
|
ja ebend du hast es auf den punkt gebracht, woher erkenne ich wann die 10 zeilen eingelesen sind, das ist ja meine frage an euch, ich dachte ihr wisst das?? |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 19.02.2007, 18:58 Titel: |
|
|
tja .. das kann ich dir dann sagen, wenn du mir mal einen ausschnitt aus der datei zeigst ... sonst ann ich nur aus der luft greifen
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 19.02.2007, 19:35 Titel: |
|
|
Hm?
Warum nich ne Schleife mit nem Zähler zusätzlich?
While (eof(#n) or ct = 10)
Is jetz vlt. net soo FB-Syntaktisch, aber dann haben wir entweder 10 Zeiln oder falls vorher, das Dateiende...
Und wieviel wir gelesen haben, wissen wir auch... |
|
Nach oben |
|
 |
General
Anmeldungsdatum: 26.11.2006 Beiträge: 149
|
Verfasst am: 19.02.2007, 19:41 Titel: |
|
|
alles klar aber kannste mir ma erklären was bei dir ct=10 ist, nunja sagen wir aber mal so, deine möglichkeit geht ja davon aus das wir wissen wieviel zahlen oder sowas in der datei drinne is, gehen wir aber ma davon aus wir wissen net wieviele daten in der datei drinne sind, was machen wir dann ?? |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 19.02.2007, 19:42 Titel: |
|
|
Dann lassen wir ct weg.
While (eof(#n))
' Daten lesen
ct = ct + 1
wend
So war des gemeint |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 19.02.2007, 19:44 Titel: |
|
|
@General .. Poste doch einfach mal ein teil der Datei!!!! .. sonst wird das hier nur rumraterei ... Das Bringt Dir nix, und uns auch nix
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 19.02.2007, 20:16 Titel: |
|
|
Das ist mein Vorschlag zum Einlesen von Daten: Code: | Option Explicit
Dim As Long Dnr=FreeFile, ct=0, NimmHierWasDuWillst=10
Dim As String DateiName="TestData.Dat", s, Datenfeld(NimmHierWasDuWillst)
Open DateiName For Input As #Dnr
Do While Not Eof(Dnr)
Input #Dnr, s
If ct<=NimmHierWasDuWillst Then Datenfeld(ct)=s
If ct=NimmHierWasDuWillst Then Exit Do
ct+=1
Loop
Close Dnr
?"Eniki..";
Sleep
End | Dieser Code ist frei verfügbar und jeder, auch der General, darf damit machen, was er möchte..
..also auch berichtigen, verbessern, ergänzen, GUI drumrum machen oder ignorieren
btw:
Die Schleife Code: | For i=0 To Eof(Dnr)
Input #Dnr, s
?"i="&i &" " &s
Next | funktioniert so nicht..
Kann auch gar nicht, denn nach dem ersten Durchlauf ist EOF(Dnr) False (Daten mal vorausgesetzt)..
..da false aber=0 ist, wird die Schleife nach dem ersten Durchlauf beendet..
General hat Folgendes geschrieben: | ..
General hat Folgendes geschrieben: |
dim as string lesen(1 to 999)
dim as integer i,punkte,neupunkte
input"Welche Punktzahl",punkte
open"liste.txt" for append as #1
print #1, punkte
close #1
open"liste.txt" for input as #1
for i=1 to len(lesen)
line input #1, lesen(i)
print lesen(i)
print len(lesen)
next
close #1
sleep
|
| Die markierten Stellen sind, gelinde gesagt, zu überdenken..
Die Anzahl der Elemente eines Arrays wird mittels UBound() ermittelt..
Siehe Befehlsreferenz
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
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.
|
|