Problem mit OpenFile - SeekFile - WriteLine

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

RoLo

Betreff: Problem mit OpenFile - SeekFile - WriteLine

BeitragSo, März 20, 2011 1:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo

Hab schon im Forum gesucht und gesehen das andere ähnliche Probleme haben, aber weil meine Frage nirgens konkret beantwortet wird eröffne ich hier ein neues Thema(ich hoffe es ist ok...).

Ich habe eine Datei und möchte ganz hinten an die Datei einen Text hängen. Was muss ich machen? Und was mach ich falsch?

Code: [AUSKLAPPEN]
sp_zu = OpenFile("recent.dat")
      SeekFile (sp_zu, FileSize("recent.dat")+Chr(10))
      WriteLine sp_zu, "blabla"
CloseFile sp_zu


Danke für alle Antworten...

RoLo

M0rgenstern

BeitragSo, März 20, 2011 1:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, nach ungefähr 10 Sekunden Forumssuche habe ich folgendes gefunden: https://www.blitzforum.de/foru...ende+datei
Aber okay.

Versuch mal die Größe der Datei in einer Variable zu speichern BEVOR du die Datei öffnest und dann einfach später die Variable benutzen. Könnte sein, dass es das schon war.

Lg, M0rgenstern
 

RoLo

BeitragSo, März 20, 2011 1:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal danke für die schnelle Antwort.(Habe den Link gelesen...)

Ich habe es nun mit einem Variable probiert aber es funktioniert leider immer nochnicht...
Hier nochmal der Code(Vielleicht liegt es daran, dass ich zweimal etwas schreiben will...):

Code: [AUSKLAPPEN]
aktuelle_filesize = FileSize("recent.dat")
   sp_zu = OpenFile("recent.dat")
      SeekFile (sp_zu, aktuelle_filesize+Chr(10))
      WriteLine sp_zu, "bla1
   CloseFile sp_zu
   
   aktuelle_filesize = FileSize("recent.dat")
   sp_zu = OpenFile("recent.dat")
      SeekFile (sp_zu, aktuelle_filesize+Chr(10))
      WriteLine sp_zu, "bla2"
CloseFile sp_zu


oder soll ich es so machen?

Code: [AUSKLAPPEN]
aktuelle_filesize = FileSize("recent.dat")
   sp_zu = OpenFile("recent.dat")
      SeekFile (sp_zu, aktuelle_filesize+Chr(10))
      WriteLine sp_zu, "bla1"
      WriteLine sp_zu, "bla2"
CloseFile sp_zu


beides funktioniert leider nicht

Gruss
RoLo

M0rgenstern

BeitragSo, März 20, 2011 1:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine Frage: Was willst du mit dem +Chr(10) nach der Filesize noch bewirken? Vor allem: Du addierst da einen string zu einem Integer, da weißt du nicht unbedingt was bei rauskommt.

Lg, M0rgenstern

Eingeproggt

BeitragSo, März 20, 2011 1:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Die zweite Möglichkeit ist ganz klar zu bevorzugen!
Und zur Lösung des Problems:
Ein "Chr(10)" beim SeekFile-Parameter anzugeben hat leider überhaupt keinen Sinn. Wenn du also am Ende der Datei einen Zeilenumbruch brauchst, so musst du diesen mit WriteByte(file,10) oder WriteLine(file,"") selbst dazu schreiben.

Sollte es dir nicht um den Zeilenumbruch gehen, beschreibe "funktioniert leider nicht" bitte genauer.

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

RoLo

BeitragSo, März 20, 2011 1:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich will mit Chr(10) auf einen neue Zeile springen.

In der Datei steht vor dem Ausführen:
Code: [AUSKLAPPEN]
Zeile1
Zeile2
Zeile3
Zeile 4


nach dem Ausführen steht
Code: [AUSKLAPPEN]
Zeile1
Zeile2
Zeile3
Zeile 4bla1
bla2


Aber es kommt auf das gleiche mit oder ohne Chr(10)
 

CO2

ehemals "SirMO"

BeitragSo, März 20, 2011 1:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso machst du bei SeekFile hinter "aktuelle_filesize" noch ein + CHR(10)? Welches Zeichen hat den den ASCII Code "10"?

Probiers mal so (So funktionierts bei mir):
Code: [AUSKLAPPEN]
sp_zu = OpenFile("recent.dat")
aktuelle_filesize = FileSize(sp_zu)
SeekFile(sp_zu, aktuelle_filesize)

Writeline sp_zu, ""
Writeline sp_zu, "bla1"
Writeline sp_zu, "bla2"


mfG,
CO2
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
 

RoLo

BeitragSo, März 20, 2011 1:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Also bei mir funktioniert es auch - manchmal.

Ich weiss wo das Problem liegt. Wenn ich die Datei im Editor bearbeitet habe und die Mausposition auf einer neuen Zeile habe dann geht es. Sonst nicht.

Bei
Zitat:
Zeile1
Zeile2
|

geht es und bei

Zitat:
Zeile1
Zeile2|

geht es nicht

was kann ich dagegen machen?

| -> soll die Position sein....

Eingeproggt

BeitragSo, März 20, 2011 2:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst an die Position FileSize(...)-1 springen und dort mit ReadByte(...) das Zeichen lesen. Ist es =10 dann ist dort ein Zeilenumbruch und du kannst einfach so weiter schreiben.
Ist es <>10 dann ist dort kein Zeilenumbruch und du kannst mit WriteLine(...,"") einen hinmachen und wie gewohnt weiter schreiben.

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

RoLo

BeitragSo, März 20, 2011 2:01
Antworten mit Zitat
Benutzer-Profile anzeigen
ok und nochmal für einen der schwer von Begriff ist Very Happy

M0rgenstern

BeitragSo, März 20, 2011 2:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist ja kein Problem, wenns mal länger dauert zum Begreifen, ich glaube das kennt jeder der programmiert. Manchmal hockt man vor nem Problem und hat soch so sehr darin verannt, dass man den Code vor Problemen nicht mehr sieht.

@Mods: Kann es sein, dass der Thread vom Theme her eher in Beginners Corner gehört?

Lg, M0rgenstern
 

RoLo

BeitragSo, März 20, 2011 2:06
Antworten mit Zitat
Benutzer-Profile anzeigen
also ich mach es jetzt so und es passiert garnichts mehr - also die datei wird überhaupt nicht verändert

Code: [AUSKLAPPEN]
aktuelle_filesize = FileSize("recent.dat")
   sp_zu = OpenFile("recent.dat")
      SeekFile (sp_zu, aktuelle_filesize-1)
      If ReadByte (sp_zu)<>10 Then WriteLine sp_zu, ""
      WriteLine sp_zu, "asdf"
      WriteLine sp_zu,  "asdf2"
   CloseFile sp_zu

Eingeproggt

BeitragSo, März 20, 2011 2:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau so hätte ich es gemeint.
Doch genau so schreibt er nichts... Ich habs debugged, von der Logik her stimmts.
Frage meinerseits an alle: Kann es sein dass man mit "OpenFile" nur ENTWEDER lesen ODER schreiben kann?
Für mich deutet alles darauf hin, dass der Read-Befehl am Anfang den Write-Zugriff danach irgendwie zum Scheitern verurteilt?

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

M0rgenstern

BeitragSo, März 20, 2011 3:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu Openfile (aus der Hilfe):
Zitat:
Dieser Befehl öffnet eine Datei für einen Lese- und Schreibzugriff gleichzeitig. Somit kann man eine Datei sehr bequem aktualisieren (z.B. Score-Liste oder Datenbank), ohne, dass eine Kopie davon erstellt werden muss.
Diese Funktion liefert einen Wert, der für weitere Read- und Write-Befehle unbedingt notwendig ist. Wird Null zurückgeliefert, dann wurde die Datei nicht gefunden


Jedoch ist in der Hilfe nirgendwo Code zu finden bei dem vor einem Schreibzugriff ein Lesezugriff erfolgt.
Sieht also scheinbar nach deiner Vermutung aus, auch wenns die Hilfe nicht hergibt.

Möglichkeit die mir momentan einfällt: Komplette Datei auslesen und temporär abspeichern, zusätzlich die neuen Zeilen dranhängen und dann mit Writefile einfach die Datei überschreiben.

Lg, M0rgenstern

ToeB

BeitragSo, März 20, 2011 3:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann es nicht sein dass Read und Write Position getrennt betrachtet werden ?

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

M0rgenstern

BeitragSo, März 20, 2011 9:35
Antworten mit Zitat
Benutzer-Profile anzeigen
@ToeB: Und selbst wenn? Mit Seekfile ist er doch auf jeden Fall am Ende der letzten Zeile angekommen, da müsste wenigstens dort neuer Text erscheinen.

@Topic: Vielleicht noch ein Lösungsansatz:

BlitzBasic: [AUSKLAPPEN]
aktuelle_filesize = FileSize("recent.dat")
iKeinvorschub = 0
sp_zu = OpenFile("recent.dat")
SeekFile (sp_zu, aktuelle_filesize-1)
If ReadByte (sp_zu)<>10 Then iKeinvorschub = 1

SeekFile (sp_zu, aktuelle_filesize-1)
If iKeinvorschub = 1 Then WriteLine sp_zu, ""
WriteLine sp_zu, "asdf"
WriteLine sp_zu, "asdf2"
CloseFile sp_zu


Ist ungetestet, kam mir nur grade so.

Lg, M0rgenstern
 

RoLo

BeitragSo, März 20, 2011 9:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei mir funktioniert es nicht.

Code: [AUSKLAPPEN]
aktuelle_filesize = FileSize("recent.dat")
   iKeinvorschub = 0
   sp_zu = OpenFile("recent.dat")
      SeekFile (sp_zu, aktuelle_filesize-1)
      If ReadByte (sp_zu)<>10 Then iKeinvorschub = 1
     
      SeekFile (sp_zu, aktuelle_filesize-1)
      If iKeinvorschub = 1 Then WriteLine sp_zu, ""
      WriteLine sp_zu, "asdf"
      WriteLine sp_zu,  "asdf2"
CloseFile sp_zu


Das Problem ist immernoch, ich werde mal schauen ob ich es mit WriteFile und ReadFile(ohne OpenFile) hinbekomme.

Meld mich dann wieder

Liebe Grüss
RoLo

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragSo, März 20, 2011 10:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
mit Writeline wird immer ein
ASCII 13 = Carriage Return
und
ASCII 10 = Linefeed angehängt

Ich habe mal eine einfache Function geschrieben...

BlitzBasic: [AUSKLAPPEN]
StringAnHaengen("recent.dat"   ,"ADSF")



Function StringAnHaengen(DateiName$ ,Wert$)

File% = OpenFile(DateiName$)

If File% <> 0 Then
Zeiger% = FileSize (DateiName$)
SeekFile File%,Zeiger%
Else
File% = WriteFile(DateiName$)
End If

WriteLine File%, Wert$


CloseFile File%
End Function


Achte darauf das die Datei nicht anderweitig benutzt wird, weil es sonst zu Problemen führt

Bei dem programmcode mit
BlitzBasic: [AUSKLAPPEN]
SeekFile (sp_zu, aktuelle_filesize-1)


wird ja grundsätzlich das letzte Byte gelöscht, egal ob es 10 ist oder nicht!

Wenn du per Hand in der Datei etwas änderst mußt du den Cursor in eine neue Zeile (als letztes Zeichen) setzten
[BB2D | BB3D | BB+]
 

RoLo

BeitragSo, März 20, 2011 14:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok vielen Dank für die ganzen Antworten ich habe es jetzt zum laufen gebracht - frag mich nicht wie Very Happy

Gruss
RoLo

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group