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:

Dateilänge

 
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
General



Anmeldungsdatum: 26.11.2006
Beiträge: 149

BeitragVerfasst am: 19.02.2007, 15:28    Titel: Dateilänge Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 19.02.2007, 16:17    Titel: Antworten mit Zitat

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... zwinkern
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



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

BeitragVerfasst am: 19.02.2007, 16:24    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
General



Anmeldungsdatum: 26.11.2006
Beiträge: 149

BeitragVerfasst am: 19.02.2007, 16:26    Titel: Antworten mit Zitat

verlegen verlegen
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
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



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

BeitragVerfasst am: 19.02.2007, 16:29    Titel: Antworten mit Zitat

ö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
Benutzer-Profile anzeigen Private Nachricht senden
General



Anmeldungsdatum: 26.11.2006
Beiträge: 149

BeitragVerfasst am: 19.02.2007, 16:37    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



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

BeitragVerfasst am: 19.02.2007, 16:43    Titel: Antworten mit Zitat

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 ... grinsen

[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
Benutzer-Profile anzeigen Private Nachricht senden
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 19.02.2007, 17:55    Titel: Antworten mit Zitat

??

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
Benutzer-Profile anzeigen Private Nachricht senden
General



Anmeldungsdatum: 26.11.2006
Beiträge: 149

BeitragVerfasst am: 19.02.2007, 18:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



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

BeitragVerfasst am: 19.02.2007, 18:25    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
General



Anmeldungsdatum: 26.11.2006
Beiträge: 149

BeitragVerfasst am: 19.02.2007, 18:31    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



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

BeitragVerfasst am: 19.02.2007, 18:45    Titel: Antworten mit Zitat

General hat Folgendes geschrieben:
Hoffe das war verständlich
Jo grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden
General



Anmeldungsdatum: 26.11.2006
Beiträge: 149

BeitragVerfasst am: 19.02.2007, 18:56    Titel: Antworten mit Zitat

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??grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



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

BeitragVerfasst am: 19.02.2007, 18:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 19.02.2007, 19:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
General



Anmeldungsdatum: 26.11.2006
Beiträge: 149

BeitragVerfasst am: 19.02.2007, 19:41    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 19.02.2007, 19:42    Titel: Antworten mit Zitat

Dann lassen wir ct weg.

While (eof(#n))
' Daten lesen
ct = ct + 1
wend

So war des gemeint
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



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

BeitragVerfasst am: 19.02.2007, 19:44    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 19.02.2007, 20:16    Titel: Antworten mit Zitat

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 grinsen
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 grinsen
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
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