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:

Input # - begrenzte Länge Strings?

 
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
SvenStueck



Anmeldungsdatum: 12.05.2005
Beiträge: 58

BeitragVerfasst am: 02.12.2008, 14:40    Titel: Input # - begrenzte Länge Strings? Antworten mit Zitat

Hallo!

Habe grad ein Programm, dass mit "Input #" Variablen aus
einer Datei liest. Unter anderem Strings, die teilweise recht
lang sind.
Scheinbar zu lang, da er bei (mit len gemessenen) 4096 Zeichen
den String abbricht weinen
Lese ich die ganze Zeile aus der Datei allerdings mit "line input" in
die selbe Variable, funktioniert es...

Kann es also sein, dass bei Input # die Grösse der eingelesenen Variablen begrenzt ist?
Und kann man dies umgehen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 02.12.2008, 15:10    Titel: Antworten mit Zitat

Sollte so eigentlich nicht passieren,
wenn nicht bei "Input #, String" nach 4096 Zeichen ein Wert mit 0 steht (Strings enden vor dem 0 Zeichen).
So wie bei "Line Input #, String" mit dem CRLF (CHR(10,13)) die Zeile endet.

Sonst kannst du nur binär die Zeichen in einen definierten Speicherbereich (Allocate) einladen.
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 02.12.2008, 15:13    Titel: Antworten mit Zitat

INPUT # bricht jedenfalls auch bei einem Komma ab, oder anders herum: Du kannst mehrere verschiedene, durch Komma getrennte Inhalte speichern und auslesen. LINE INPUT liest bis zum Zeilenende, egal ob er auf ein Komma stößt oder nicht.

Ob INPUT # auch bei einer Länge von 4096 Zeichen abbricht, weiß ich nicht; jedenfalls ist die Zahl verdächtig, da das genau 2^12 sind.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
SvenStueck



Anmeldungsdatum: 12.05.2005
Beiträge: 58

BeitragVerfasst am: 02.12.2008, 15:18    Titel: Antworten mit Zitat

@volta: nope, ne 0 gibts da nicht..
@nemored: Kommas sind auch nicht drin..., bzw. die Daten in dem File sind bei mir auch durch Kommata getrennt.

also weiterhin ein Rätsel verwundert
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 02.12.2008, 15:24    Titel: Antworten mit Zitat

Versuch mal ob bei
Code:
Dim a as string*10000

Input #, a nach 10000 Zeichen abbricht?
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
SvenStueck



Anmeldungsdatum: 12.05.2005
Beiträge: 58

BeitragVerfasst am: 02.12.2008, 17:37    Titel: Antworten mit Zitat

Hilft leider auch nix... liegt in dem Sinne auch nicht an der Variable, da bei:

Code:
Type udt
    Number As Integer
    User As String
    Datum As Double
    Uhr As Double
    Text As String
End Type

Redim Shared post() As udt

Open "out.txt" for input as #1

Do
idx+=1
Redim Preserve post(idx)

Input #1,post(idx).Number, d,d,d,post(idx).Text   'die Variable
Text abgeschnitten, und bei

Line Input #1,post(idx).Text  '(natürlich an gleicher Position in Datei) die gleiche Variable Text nicht abgeschnitten, und ja sogar noch um die Vars davor länger wird...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 02.12.2008, 20:43    Titel: Antworten mit Zitat

Nur als Hinweis:

http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/BildschirmMasken.html

=> eine ähnlicher INPUT-Ersatz könnte auch in FreeBasic Sinn machen...
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
SvenStueck



Anmeldungsdatum: 12.05.2005
Beiträge: 58

BeitragVerfasst am: 03.12.2008, 09:28    Titel: Antworten mit Zitat

dreael hat Folgendes geschrieben:
Nur als Hinweis:

http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/BildschirmMasken.html

=> eine ähnlicher INPUT-Ersatz könnte auch in FreeBasic Sinn machen...


Thx für den Link, aber des ist doch nur für Tatatureingaben gedacht, oder?
Ich lese ja aus einer Datei ein.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 03.12.2008, 16:16    Titel: Antworten mit Zitat

Beispiel von mir ist für Tastatureingabe (Eingabemasken in DOS-Anwendungen). Sonst wenn es um Dateien geht, dann ist der Fall wesentlich einfacher:
Code:
INPUT$()

=> Lies dazu

http://www.freebasic-portal.de/index.php?s=reftopic&id=318

durch! Diese Funktion gab es bereits in QB.

Wichtige Kleinigkeit im Verhalten: An und für sich entspricht diese Funktion in etwa einem fread() in C unter UNIX/Linux. Während letzteres immer die effektiv gelesene Anzahl Zeichen zurückmeldet (=wenn Datei bald am Ende ist, wird halt einfach nur noch der Rest eingelesen), generierte zumindest QB einen Laufzeitfehler, weil es stur versucht, soviele Zeichen einzulesen. Ob die FreeBasic-Entwickler dies verbessert haben (=ohne Murren einfach einen verkürzten String zurückliefern, falls Datei bald am Ende), kann ich nicht sagen => Test empfohlen.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
SvenStueck



Anmeldungsdatum: 12.05.2005
Beiträge: 58

BeitragVerfasst am: 03.12.2008, 16:38    Titel: Antworten mit Zitat

Zugegeben, den
Zitat:
INPUT[$](n, [#f])
Befehl zum einlesen einer bestimmten Anzahl von Zeichen aus einer Datei kannte ich noch gar nicht,
hilft mir aber noch weniger, da "n" auf 255 Zeichen begrenzt ist.

@dreael, meinen Codeblock oben hast schon gesehen, oder? Nimms mir nicht böse, aber es kommt mir fast so vor, dass du versuchst mir zu erklären, wie man allgemein Zeichen einliest zwinkern Aber ich (oder FB) habe ja eigentlich ein ganz spezielles Problem traurig
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The_Muh
aka Mark Aroni


Anmeldungsdatum: 11.09.2006
Beiträge: 718

BeitragVerfasst am: 03.12.2008, 17:52    Titel: Re: Input # - begrenzte Länge Strings? Antworten mit Zitat

SvenStueck hat Folgendes geschrieben:
Hallo!

Habe grad ein Programm, dass mit "Input #" Variablen aus
einer Datei liest. Unter anderem Strings, die teilweise recht
lang sind.
Scheinbar zu lang, da er bei (mit len gemessenen) 4096 Zeichen
den String abbricht weinen
Lese ich die ganze Zeile aus der Datei allerdings mit "line input" in
die selbe Variable, funktioniert es...

Kann es also sein, dass bei Input # die Grösse der eingelesenen Variablen begrenzt ist?
Und kann man dies umgehen?


Hab ich nicht feststellen können, auch nicht als ich mit MuhEdit knapp 200 MB text eingelesen hab (10000 zeichen pro zeile?) Auch ne Internetbekanntschafft konte mit MuhEdit ca 512MB text verarbeiten (ca 20000 zeichen pro zeile)

Und MuhEdit benutzt auch Line Input zum einlesen der datei.
Mich wunderts ja, das du deinen code noch nicht hier gepastet hast, sowas vereinfach die hilfe ungemein.

mfg
The_Muh
_________________
// nicht mehr aktiv //
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
SvenStueck



Anmeldungsdatum: 12.05.2005
Beiträge: 58

BeitragVerfasst am: 03.12.2008, 18:03    Titel: Re: Input # - begrenzte Länge Strings? Antworten mit Zitat

The_Muh hat Folgendes geschrieben:


Hab ich nicht feststellen können, auch nicht als ich mit MuhEdit knapp 200 MB text eingelesen hab (10000 zeichen pro zeile?) Auch ne Internetbekanntschafft konte mit MuhEdit ca 512MB text verarbeiten (ca 20000 zeichen pro zeile)

Und MuhEdit benutzt auch Line Input zum einlesen der datei.
Mich wunderts ja, das du deinen code noch nicht hier gepastet hast, sowas vereinfach die hilfe ungemein.

mfg
The_Muh


Hi! ein Ausschnitt ist ja oben. Der sollte auch alles relevante beinhalten, wie ich finde lächeln
Ne, mit Line Input hauts ja auch hin. Das Problem taucht nur mit Input # auf.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 03.12.2008, 18:07    Titel: Antworten mit Zitat

SvenStueck hat recht!
Ich habe es gerade ausprobiert.
Es werden aus einem Inputbuffer nur 4096 Byte bei "Input #, string" in den String übertragen (bei "Line Input #, String" ist das nicht so).

Das ist kein Bug!!!!!
siehe: http://www.freebasic.net/forum/viewtopic.php?p=94187#94187
Zitat:
Currently, all input for strings/zstrings is (arbitrarily) limited to 4096 characters.

_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
SvenStueck



Anmeldungsdatum: 12.05.2005
Beiträge: 58

BeitragVerfasst am: 04.12.2008, 09:23    Titel: Antworten mit Zitat

volta hat Folgendes geschrieben:
SvenStueck hat recht!
Ich habe es gerade ausprobiert.
Es werden aus einem Inputbuffer nur 4096 Byte bei "Input #, string" in den String übertragen (bei "Line Input #, String" ist das nicht so).

Das ist kein Bug!!!!!
siehe: http://www.freebasic.net/forum/viewtopic.php?p=94187#94187
Zitat:
Currently, all input for strings/zstrings is (arbitrarily) limited to 4096 characters.


Ah, Danke! Hätt ich auch mal drauf kommen können, in dem Forum zu suchen verlegen
Schade, dass des nicht in der Hilfe vermerkt ist.
Dann probier ich es hald mal mit den alternativen Mehoden. Also GET oder LINE INPUT...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
SvenStueck



Anmeldungsdatum: 12.05.2005
Beiträge: 58

BeitragVerfasst am: 04.12.2008, 10:12    Titel: Antworten mit Zitat

Hmm, mal was anderes: Ich habe da ein Problem mit dem CharToOem aus der windows.bi.

Code:
#include "windows.bi"

dim as string inDatei="über"
dim as string SollSein="über"

print inDatei, SollSein
CharToOem inDatei,inDatei
CharToOem SollSein, SollSein
print inDatei,SollSein

sleep
end


Was ist des für eine beschissene Codierung der Datei, dass "über" da als "über" drinsteht? Und wie kann ich des wieder lesbar machen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 04.12.2008, 14:36    Titel: Antworten mit Zitat

UTF-8/16/32
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 04.12.2008, 14:37    Titel: Antworten mit Zitat

UTF-8/16/32

Da ist die Encoding Klausel dein Freund...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 04.12.2008, 15:02    Titel: Antworten mit Zitat

hatte mich vor laengerem mal damit befasst und zuletzt kam dann sowas hier raus, hatte recht gut funktioniert....

Code:

Declare Function myCharToUTF Cdecl Alias "fb_CharToUTF"   _
                              ( Byval encod As Integer, _
                         Byval src As Zstring Ptr, _
                         Byval chars As Integer, _
                         Byval dst As Any Ptr, _
                        Byval bytes As Integer Ptr ) As Any Ptr

Declare Function myUTFToChar Cdecl Alias "fb_UTFToChar" _
                              ( Byval encod As Integer, _
                         Byval src As Any Ptr, _
                        Byval dst As Zstring Ptr, _
                        Byval chars As Integer Ptr ) As Zstring Ptr

Declare Function myASCII2UTF  (Byval ConvertString As String) As String
Declare Function myUTF2ASCII  (Byval ConvertString As String) As String


/'
    myASCII2UTF
   
    Syntax    : myASCII2UTF (MeinText[$])
    Typ       : Funktion
    Kategorie : Stringmanipulation
   
    Wandelt einen "String" mit ASCII Inhalt
    zu einen "String" mit UTF8 Inhalt um.
'/   

Function myASCII2UTF (Byval ConvertString As String) As String
   Dim As Zstring Ptr pZ
   Dim As Zstring Ptr pR
   Dim As Integer     lS
   Dim As Integer Ptr pI

   lS = Len(ConvertString)
   pI = Callocate(4)
   pR = Callocate(4 * lS)
   pZ = Strptr(ConvertString)
   
   myCharToUTF( 1, pZ, lS, pR, pI)
   
   pR = Reallocate(pR, *pI)
   Function = *pR
   
   Deallocate pI
   Deallocate pR
End Function

/'
    myASCII2UTF
   
    Syntax    : myUTF2ASCII (MeinText[$])
    Typ       : Funktion
    Kategorie : Stringmanipulation
   
    Wandelt einen "String" mit UTF8 Inhalt
    zu einen "String" mit ASCII Inhalt um.
'/   

Function myUTF2ASCII (Byval ConvertString As String) As String
   Dim As Zstring Ptr pZ
   Dim As Zstring Ptr pR
   Dim As Integer     lS
   Dim As Integer Ptr pI

   lS = Len(ConvertString)
   pI = @lS
   pR = Callocate(lS)
   pZ = Strptr(ConvertString)
   
   myUTFToChar( 1, pZ, pR, pI)
   
   pR = Reallocate(pR, *pI)
   Function = *pR
   
   Deallocate pI
   Deallocate pR
End Function

_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
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