Fehler beim Reinschreiben in eine Textdatei

Anfängerfragen zum Programmieren mit PureBasic.
HemSA
Beiträge: 221
Registriert: 16.10.2005 13:59
Wohnort: Manisa / Türkei
Kontaktdaten:

Fehler beim Reinschreiben in eine Textdatei

Beitrag von HemSA »

Hallole Ihr,
ich lese von einer Exceldatei Werte aus und schreibe sie in eine Textdatei. Das klappt mit dieser Version auch gut.

Hier der gekürtzte Teil vom Programm:

Code: Alles auswählen


For i=2 To 1500 ; in Excelseite mit 2. Zeile beginnen mit auslesen

bla
bla 
bla

If OpenFile(1,"C:\GAS.TAB") 
        
    While Eof(1) = 0       
       
       If gastabs.s=gastabelles.s
       
        FileSeek(1,(zeilel.l-1)*247+20) 
        WriteString(1, gasflowmaxs.s)             
        jahrs.s=FormatDate("%yyyy",Date())
        monats.s=FormatDate("%mm",Date())
        tags.s=FormatDate("%dd",Date()) 
        stundens.s=FormatDate("%hh",Date()) 
        minutens.s=FormatDate("%ii",Date()) 
        sekundens.s=FormatDate("%ss",Date())
          
          
        textgesamtgastabs.s = gastabelles.s+" "+tags.s+"."+monats.s+"."+jahrs.s+" "+stundens.s+":"+minutens.s+":"+sekundens.s+" "+gasflowmaxs.s+" "+gasflowmins.s+" "+testgasviscositys.s+" "+testgasdensitys.s
          
          
         If OpenFile(2,"C:\Gas.log")
             laengel.l= Lof(2)                           
             FileSeek(2,laengel.l)                 
             WriteStringN(2,textgesamtgastabs.s)              
             CloseFile(2)                                           
         EndIf
        
      EndIf
    
      Wend
 
 Else
    MessageRequester("Uyarı","Gas tablosu acamadı!")
  EndIf

  CloseFile(1) 

Next i

Nun haben sich die Datensätze auf ca. 1000 erhöht. Und da dachte ich, dass es nicht so nett ist 2 Dateien 1500 mal zu öffnen und wieder zu schliessen.
Das Ergebnis war folgendes. Ich habe die OPENFILE und CLOSEFILE ausserhalb von der FOR NEXT Schleife gelegt.

Code: Alles auswählen

If OpenFile(1,"C:\GAS.TAB") 
If OpenFile(2,"C:\Gas.log")

For i=2 To 1500 ; in Excelseite mit 2. Zeile beginnen mit auslesen

bla 
bla


    While Eof(1) = 0        
                     
       If gastabs.s=gastabelles.s
     
    
        FileSeek(1,(zeilel.l-1)*247+20)  
        WriteString(1, gasflowmins.s)            
        jahrs.s=FormatDate("%yyyy",Date())
        monats.s=FormatDate("%mm",Date())
        tags.s=FormatDate("%dd",Date()) 
        stundens.s=FormatDate("%hh",Date()) 
        minutens.s=FormatDate("%ii",Date()) 
        sekundens.s=FormatDate("%ss",Date())
          
          
        textgesamtgastabs.s = gastabelles.s+" "+tags.s+"."+monats.s+"."+jahrs.s+" "+stundens.s+":"+minutens.s+":"+sekundens.s+" "+gasflowmaxs.s+" "+gasflowmins.s+" "+testgasviscositys.s+" "+testgasdensitys.s
          
          
        laengel.l= Lof(2)                 
             FileSeek(2,laengel.l)          
             WriteStringN(2,textgesamtgastabs.s)  
      EndIf
    
    Wend
 Next i

  Else
    MessageRequester("Uyarı","Exel-WINTED-Gas.log dosyası acamadı!")
  EndIf
  
  Else
    MessageRequester("Uyarı","Gas tablosu acamadı!")
  EndIf
  
  CloseFile(2) 
  CloseFile(1) 

Jetzt wird allerdings nur der erste Wert von der Exceldatei in die Textdateien reingeschrieben.

Hat da einer eine Idee woran das Liegt ( EOF kommt ja normalerweise direkt nach dem OPENFILE - ist es das? )
PB 4.02 (wegen Disphelper), 5.72 (Windows) (x64)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

wenn du die datei wo du rein schreibst offen lässt kannst du dir :
FileSeek(2,laengel.l)
sparen, da er ja automatisch imme,r am ende ist

denn Lof(2) gibt meiner Meinung nach immer die Länge der "geöffneten" Datei zurück, und nciht wenn sie gerade verändert wird
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
HemSA
Beiträge: 221
Registriert: 16.10.2005 13:59
Wohnort: Manisa / Türkei
Kontaktdaten:

Beitrag von HemSA »

Hallo STARGÅTE,
Danke erst mal,
ich bin eben der Meinung, das LOF(Dateinummer) im Moment des Aufrufes berechnet wird. Aber vielleicht liege ich da auch daneben.
Auch wird nur die erste Zeile von der Exceldatei reingeschrieben - nicht die letzte.

Von der Laufzeit ( mit Fehler ) hat sich auch kein grosser Unterschied zwischen den beiden Programmen ergeben.
30 Sekunden mit 1500 maligem öffnen und schliessen der beiden Dateien,
20 Sekunden ohne 1500 maligem öffnen und schliessen der Dateien.

Reist wohl nicht viel raus was die Geschwindigkeit angeht ( mir kommt es da auch nicht auf Sekunden an ).
Von der Mechanik aus gesehen weiss ich es natürlich nicht ( geht die Platte schneller kaputt? )
PB 4.02 (wegen Disphelper), 5.72 (Windows) (x64)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

es wäre einfach falsch, die Datei 1500 mal zu öffnen und zu schließen.

außerdem ist es ebenfalls falsch, das FileSeek an der Stelle zu benutzen.
das würde ich erstmal eliminieren, bevor ich irgendwelche anderen fehler suche.

...

ein fehler, der mir auffällt:
du hast auch auf File01 ein WriteString drin, kein Read-irgendwas.
wenn du nirgens was liest, woher willst du was zum reinschreiben haben?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
HemSA
Beiträge: 221
Registriert: 16.10.2005 13:59
Wohnort: Manisa / Türkei
Kontaktdaten:

Beitrag von HemSA »

Hallo Kaeru Gaman,
das mit dem Öffnen der Dateien 1500 mal will ich auch nicht.

In der Hilfe ist dieses angeben. Und ich will ja den Zeiger an das Ende der Datei stellen für einen neuen Eintrag. In meinen anderen Programmen klappt das ja auch gut ( siehe 1. Programm )

Code: Alles auswählen

If ReadFile(0, file$) 
      length = Lof(0)                       ; ermitteln der Dateilänge
      FileSeek(0, length - 10)              ; setzen des Zeigers auf 10 Zeichen vor Ende der Datei
außerdem ist es ebenfalls falsch, das FileSeek an der Stelle zu benutzen.
das würde ich erstmal eliminieren, bevor ich irgendwelche anderen fehler suche.
Ohne ein FileSeek, wie soll das dann funktionieren etwas ans Ende der Textdatei hinzuzufügen? Was soll da nach der Hilfe falsch sein.?
Wie gesagt, es ist nur ein Auszug von dem ganzen Programm.
PB 4.02 (wegen Disphelper), 5.72 (Windows) (x64)
Little John

Beitrag von Little John »

Du willst also etwas an eine bestehende Datei anhängen? Ich denke dann brauchst Du schon FileSeek(), aber nur am Anfang des Programms außerhalb der Schleife! Nicht den Dateizeiger innerhalb der Schleife immer wieder zurücksetzen!
Du kannst auch 'mal das Ganze mit 2 kleinen Dateien ausprobieren, die lesbaren Text enthalten und dann ggf. einige Dinge im Programm verändern. So kannst Du zu 100% nachvollziehen, wie sich die Änderungen im Programm auswirken.

Gruß, Little John
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

wenn du eine datei öffnest, um sie komplett zu schreiben,
und erst dann wieder schließt, dann brauchst du zwischendrin kein Fileseek.

Code: Alles auswählen

CreateFile(0, "Test.dat")
  For n=0 To 99
    WriteStringN(0,"Zeile Nr. "+Str(n))
  Next
CloseFile(0)
die Fileseek-Variante aus der Help ist dazu da,
um an eine vorher schon bestehende Datei etwas anzuhängen.

Code: Alles auswählen

OpenFile(0, "Test.dat")
FileSeek(0, Lof(0))
  For n=100 To 199
    WriteStringN(0,"Zeile Nr. "+Str(n))
  Next
CloseFile(0)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

All dieses über FileSeek steht schön beschrieben in der PB-Hilfe
unter OpenFile()
PB-Hilfe zu OpenFile() hat geschrieben:Wenn eine existierende Datei mittels OpenFile() geöffnet wird, dann wird der Dateizeiger an den Anfang der Datei gesetzt.
...
Wenn Daten zu einer existierenden Datei hinzugefügt werden sollen, muss der Dateizeiger zuerst auf das Ende der Datei gesetzt werden. Hierfür werden nach OpenFile() die Befehle FileSeek() und Lof() verwendet
Eigentlich könnte Fred zum OpenFile() Parameter wie #PB_Append o.a.
mit einbauen. So machen das eben andere Programmiersprachen und
erspart einige Programmzeilen für das Fileseek() und Lof() beim öffnen der File.

Wenn also kein Parameter angegeben wird, würde der Zeiger wie bisher
beim erneuten Öffnen am Anfang stehe.
Sobald dieser kleine winzige Parameter vorhanden ist, würde der Datenzeiger ans Ende gesetzt.

Alle weiteren Angaben erledigt, dann FileSeek(), wenn man bestimmte
Stellen überschreiben will.

War nur mal so ein Gedanke nebenbei :wink:

Gruß, Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Sebastian
Beiträge: 322
Registriert: 14.06.2006 16:46
Wohnort: Kiel

Beitrag von Sebastian »

Hej Falko! Das ist eine sehr sinnvolle Idee! Teil das doch mal dem PB-Team mit! Ich denke, dass sie für diesen Vorschlag sehr aufgeschlossen sein werden, schließlich dürfte die Umsetzung nicht sonderlich mühevoll sein.
(Win 11 64-bit, PB 6.04 und 6.10)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

> schließlich dürfte die Umsetzung nicht sonderlich mühevoll sein
Das dafür erforderliche Macro zu schreiben erfordert ca. 20 - 40 Sek. :mrgreen:
Lieber ein Macro schreiben statt ewig zu warten, für so einen PillePalle Kram,
dafür haben wir die ja.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten