Einlesen/Auslesen von Dateien

Anfängerfragen zum Programmieren mit PureBasic.
phyll
Beiträge: 12
Registriert: 26.03.2007 19:11

Einlesen/Auslesen von Dateien

Beitrag von phyll »

Hallo erstmal!

Folgendes Problem: Ich schreibe grad an einem Verschlüselungstool, das txt-Dateien einlesen und abspeichern können soll (aus einem stringGadget)
Dummerweise wird weder etwas eingelesen noch steht in den gespeichertern Dateien irgendwas drin. Mein Code:

Code: Alles auswählen

If OpenWindow(0,0,0,1000,600,#PB_Window_SystemMenu | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget,"SWV-Algorithmus Pre-Alpha") 
...
StringGadget(2,20,80,960,435,"",#PB_String_MultiLine) 
ButtonGadget(6,680,530,90,50,"Bestehende Textdatei öffnen",#PB_Button_MultiLine)
    ButtonGadget(7,790,530,90,50,"Text speichern unter...",#PB_Button_MultiLine)

...
If EventID=#PB_EventGadget
      If EventGadgetID()=6
        Dateiname.s = OpenFileRequester("Datei öffnen...  (Nur txt-Dateien sind erlaubt)","","Text-Dateien | *.txt",0)
        If OpenFile(0,Dateiname)
          FileSeek(0)
          SetGadgetText(2,ReadString())
        EndIf       
      EndIf 
    EndIf
    
    If EventID=#PB_EventGadget
      If EventGadgetID()=7
        SpeicherDatei.s = SaveFileRequester("Text speichern unter...","","Text-Dateien | *.txt",0)
        If ReadFile(2,SpeicherDatei)
          Repeat 
            Result = MessageRequester("Warnung","Diese Datei existiert bereits. Soll sie überschrieben werden?",#PB_MessageRequester_YesNoCancel)
            If Result=6
              If CreateFile(1,SpeicherDatei +".txt") = 0
                FileSeek(0)
                WriteString(GetGadgetText(2))
              EndIf 
            ElseIf Result=7
              SpeicherDatei = SaveFileRequester("Text speichern unter...","","Text-Dateien | *.txt",0) 
            EndIf
          Until Result=6 Or Result=2
        EndIf 
      EndIf 
    EndIf
...
EndIf
Was ist da falsch? Danke schonmal, phyll

edit: 1. Problem selbst gelöst, die Datei, die ich auslesen wollte, fing mit einem Zeilenumbruch an...
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 »

Danke das der Code so nicht ausführbar ist :freak:
Zum lesen ReadFile nutzen, nicht OpenFile, FileSeek ist überflüssig. CloseFile
fehlt ganz.

Und bitte vermerken das es sich um PB3.xx Code handelt, ansonsten gehen
alle von PB4 Code aus.
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
phyll
Beiträge: 12
Registriert: 26.03.2007 19:11

Beitrag von phyll »

Sorry, ich muste den Code kürzen, sonst wärs allzu lang geworden, da hab ich wohl was gestrichen, was wichtig war...

Den Vorschlag probier ich gleich aus. Danke.

edit:

So, hab das mal gestestet und dabei gleich noch nen anderen Fehler gefunden. Das Problem, dass nichts in den erstellten txt-files drinsteht, besteht aber immer noch. Hier jetzt nochmal der komplette Code.

Code: Alles auswählen

Procedure.s verschluessler(verText.s)
EndProcedure 

Procedure.s entschluessler(entText.s)
EndProcedure 

If OpenWindow(0,0,0,1000,600,#PB_Window_SystemMenu | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget,"SWV-Algorithmus Pre-Alpha") 
  
  If CreateGadgetList(WindowID())
    TextGadget(0,20,20,940,20,"Dies ist der SWV-Verschlüsselungsalgorithmus. Für Sicherheit wird keine Garantie übernommen!",0)
    TextGadget(1,20,50,960,20,"Hier Text zum Verschlüsseln / Entschlüsseln eingeben",#PB_Text_Center)
    StringGadget(2,20,80,960,435,"",#PB_String_MultiLine) 
    ButtonGadget(3,900,530,80,50,"Abbrechen")
    ButtonGadget(4,20,530,310,50,"Verschlüsselung starten!")
    ButtonGadget(5,350,530,310,50,"Entschlüsselung starten!")
    ButtonGadget(6,680,530,90,50,"Bestehende Textdatei öffnen",#PB_Button_MultiLine)
    ButtonGadget(7,790,530,90,50,"Text speichern unter...",#PB_Button_MultiLine)
    
  EndIf
  
  Repeat
  
    Quit = 0
    
    EventID = WaitWindowEvent()
    
    If EventID=#PB_Event_CloseWindow
      Quit=1
    EndIf 
    
    If EventID=#PB_EventGadget
      If EventGadgetID()=3
        Quit=1
      EndIf
    EndIf

    If EventID=#PB_EventGadget
      If EventGadgetID()=4
        SetGadgetText(2,verschluessler(GetGadgetText(2))) 
      EndIf
    EndIf

    If EventID=#PB_EventGadget
      If EventGadgetID()=5
        SetGadgetText(2,entschluessler(GetGadgetText(2)))
      EndIf 
    EndIf
    
    If EventID=#PB_EventGadget
      If EventGadgetID()=6
        Dateiname.s = OpenFileRequester("Datei öffnen...  (Nur txt-Dateien sind erlaubt)","","Text-Dateien | *.txt",0)
        If ReadFile(0,Dateiname)
          SetGadgetText(2,ReadString())
          CloseFile(0)
        EndIf       
      EndIf 
    EndIf
    
    If EventID=#PB_EventGadget
      If EventGadgetID()=7
        SpeicherDatei.s = SaveFileRequester("Text speichern unter...","","Text-Dateien | *.txt",0)
        If ReadFile(2,SpeicherDatei) <> 0
          Repeat 
            Result = MessageRequester("Warnung","Diese Datei existiert bereits. Soll sie überschrieben werden?",#PB_MessageRequester_YesNoCancel)
            If Result=6
              If OpenFile(1,SpeicherDatei +".txt") = 0
                WriteStringN(GetGadgetText(2))
                CloseFile(1)
              EndIf 
            ElseIf Result=7
              SpeicherDatei = SaveFileRequester("Text speichern unter...","","Text-Dateien | *.txt",0) 
            EndIf
          Until Result=6 Or Result=2
        Else 
          If OpenFile(1,SpeicherDatei +".txt") = 0
            WriteStringN(GetGadgetText(2))
            CloseFile(1)
          EndIf 
        EndIf 
      EndIf 
    EndIf

    
  Until Quit = 1
EndIf 
Wie man sieht, existieren der Verschlüssler und der Entschlüssler noch nicht, man kann also noch nicht wirklich was mit dem Tool anfangen. Ach ja, noch ne Frage nebenbei: Gibt es eine Methode, mit der an den erstellten Dateinamen die Endung nicht mehr drangeschrieben wird, wenn sie schon da ist?

Danke, phyll
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Gibt's einen Grund, warum Du noch PB3.94 verwendest?
Momentan aktuell ist die Version 4.02.

Ich frage, weil ich nur noch 'Support' für V4.x leiste.

Grüße ... Kiffi
a²+b²=mc²
phyll
Beiträge: 12
Registriert: 26.03.2007 19:11

Beitrag von phyll »

Nein,Grund gibt es eigentlich keinen, außer dass ich zu faul zum upgraden bin...
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 »

Code: Alles auswählen

If OpenFile(1,SpeicherDatei +".txt") = 0
  WriteStringN(GetGadgetText(2))
  CloseFile(1)
EndIf
In deutsch:
Wurde SpeicherDatei mit Endung ".txt" nicht geöffnet
schreibe text

Das wird wohl so nie dazu führen, das ein String geschrieben wird.

PS: Die ständigen wiederholungen in den IFs sind unschön, da kannste noch
viel an Code sparen und es übersichtlicher machen.
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
phyll
Beiträge: 12
Registriert: 26.03.2007 19:11

Beitrag von phyll »

Danke für den Tip! So nen dummen Fehler hätte ich echt selbst sehen können... :freak:
Eine Frage geklärt, die nächste folgt sogleich: Ist es möglich, dass in einem StringGadget automatisch ein Zeilenumbruch generiert wird, wenn man über den Rand hinausschreiben will?
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 »

>> Ist es möglich, dass in einem StringGadget automatisch ein Zeilenumbruch generiert wird
StringGadget ist in PB einzeilig, welchen Sinn hätte das?
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
phyll
Beiträge: 12
Registriert: 26.03.2007 19:11

Beitrag von phyll »

Ich verwende bei diesem Gadget #PB_String_Multiline.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Diese Konstante existiert in PB 4 nicht mehr; du wirst also ein EditorGadget() nehmen müssen oder weiterhin ein StringGadget(), aber mit einer der #ES_* Konstanten (weißt grad nicht welche).

Sollte edel sich hier rumtreiben und dies lesen, wird er bestimmt die passende Konstanten nennen können, wo er doch der EditorGadget-Spezialist hier im Forum ist <)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten