Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   file of char delphi7 geht nicht (https://www.delphipraxis.net/164372-file-char-delphi7-geht-nicht.html)

lecomte 9. Nov 2011 19:28

Delphi-Version: 5

file of char delphi7 geht nicht
 
Hallo -

ich versuche, eine eudora-mailbox ("inbox.toc") als file of char zu lesen.
die chars 18 bis 31 beinhalten das datum.
das funktioniert mit turbo pascal 7, ergibt aber in delphi nur laufzeitfehler.

gibt es da einen unterschied in der file of char behandlung zwischen turbo pascal 7 und delphi7SE?


der relevante programmteil sieht wie folgt aus:

---------------------------------------------------------

var st,mess:string;
toc:file of char;
ch:char;
fehler,tag,monat,jahr:integer;

...........
mess:='';
assignfile(toc,'inbox.toc');
reset(t);
for a:=1 to 218 do
begin
read(toc,ch);
mess:=mess+ch;
end;
st:=copy(mess,19,31);
st:=copy(st,1,pos(' ',st)-1);
val(copy(st,1,2),tag,fehler);
val(copy(st,4,2),monat,fehler);
val(copy(st,7,4),jahr,fehler);
..............


---------------------------------------------------------

Gibt's einen Tipp?
Danke!

jbg 9. Nov 2011 19:30

AW: file of char delphi7 geht nicht
 
Zitat:

ergibt aber in delphi nur laufzeitfehler.
Der da wäre?

jaenicke 9. Nov 2011 19:34

AW: file of char delphi7 geht nicht
 
Nimm einfach einen TFileStream, das ist mit Delphi sinnvoller und einfacher.

Bernhard Geyer 9. Nov 2011 19:51

AW: file of char delphi7 geht nicht
 
Zitat:

Zitat von lecomte (Beitrag 1135381)
Delphi-Quellcode:
assignfile(toc,'inbox.toc');

Probiers mal mit einer Angabe mit kompletten Pfad. Wer weiß welchen aktuellen Anwendungspfad deine Anwendung gerade hat.

Uwe Raabe 9. Nov 2011 23:06

AW: file of char delphi7 geht nicht
 
Ist ja vielleicht nur falsch abgetippt:

assignfile(toc,'inbox.toc');
reset(t);

lecomte 10. Nov 2011 15:03

AW: file of char delphi7 geht nicht
 
danke für die hilfeversuche.
in der tat gibt es bei dem von mir vorgestellten programmtext einen tippfehler, der aber im tatsächlichen programm nicht vorhanden ist: statt "reset(t)" gehört "reset(toc)".

die datei "inbox.toc" wird von keinem anderen programm verwendet. sie ist eine kopie der tatsächlichen eudora-inbox.
"inbox.toc" lässt sich auch problemlos lesen und in einen anderen file kopieren - zeichen für zeichen. die zeichen lassen sich auch alle in einen string kopieren.

Bloss:
dort, wo dann in turbo pascal tatsächlich interpretierbare werte zu finden sind, stehen in delphi nur zeichen, die wie ein kleines quadrat aussehen.

meine frage ist daher nach wie vor: gibt es beim lesen eines file of char einen relevanten unterschied zwischen dem, was ein DOS-basiertes programm (turbo pascal) und ein windows porgramm (delphi7) mit ein und dem gleichen zeichen anstellt??

DeddyH 10. Nov 2011 15:10

AW: file of char delphi7 geht nicht
 
TP verwendet ASCII, Delphi 7 aber Ansi. Versuch doch einmal, Deinen String mit MSDN-Library durchsuchenOEMToCharBuff in Ansi umzuwandeln.

[edit] Ein Test mit Delphi 2007 ohne großartige Fehlerbehandlung (die Datei ist ASCII-kodiert):
Delphi-Quellcode:
var
  s: Ansistring;
  f: file of AnsiChar;
  c: AnsiChar;
begin
  AssignFile(f, 'C:\temp\Gnödelgnüdel.txt');
  {$I-}
  Reset(f);
  {$I+}
  if IOResult = 0 then
    begin
      while not EOF(f) do
        begin
          read(f, c);
          s := s + c;
        end;
      CloseFile(f);
    end;
  ShowMessage(s); //Gn”delgndel
  OEMToCharBuffA(PAnsiChar(s), PAnsiChar(s), Length(s));
  ShowMessage(s); //Gnödelgnüdel
end;
Ich verwende OEMToCharBuff, weil bei OEMToChar eine Sicherheitswarnung im MSDN steht, also besser nicht benutzen. [/edit]

lecomte 10. Nov 2011 17:52

AW: file of char delphi7 geht nicht
 
danke für die hilfe.
das programm, wie du es schreibst, funktioniert tadellos -> keine fehlermeldung.

das ändert aber für delphi überhaupt nix:
turbo pascal und notepad zeigen folgendes an:

1 À\ï¾TìBA  P P 5Ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  Œ Ô:ç  > =^äM  06:19 31.05.2011

Delphi aber zeigt, egal ob ich die datei als stream lese, als file of char lese, in einen string umwandle und in eine datei schreibe oder anzeige, delphi also zeigt:

" "
(ohne leerzeichen).

Ist das erklärbar?
Oder der beweis dafür, dass es außerirdische gibt?
Wo liegt MEIN fehler?

DeddyH 10. Nov 2011 18:04

AW: file of char delphi7 geht nicht
 
Bist Du sicher, dass es sich um ein File of Char handelt? Vermutlich ist da ein #0 o.Ä. dazwischen, was den String dann durcheinander bringt. An Deiner Stelle würde ich es auch einmal mit einem Stream versuchen, aus dem Du dann die für Dich interessanten Bytes herauskopierst.

[edit] Gerade ausprobiert:
Delphi-Quellcode:
var
  fs: TFileStream;
  ss: TStringStream;
  s: string;
begin
  fs := TFileStream.Create(Dateiname, fmOpenRead);
  try
    ss := TStringStream.Create('');
    try
      fs.Position := 12;
      ss.CopyFrom(fs, fs.Size - fs.Position);
      s := ss.DataString;
      ShowMessage(s);
    finally
      ss.Free;
    end;
  finally
    fs.Free;
  end;
end;
[/edit]

lecomte 10. Nov 2011 18:26

AW: file of char delphi7 geht nicht
 
mit streams hab ich keine erfahrung (hab jetzt 25 jahre mit turbo pascal gelebt :-)). hab es grad mit handbuch versucht, bin aber gescheitert.

wie lese ich aus der datei "inbox.toc" die ersten 322 zeichen heraus (die datei ist deutlich länger als 322) und übertrage die zeichen 122 bis 153 auf einen string?
oder ist eine solche frage unüblich in einem forum? krieg ich jetzt die antwort read the effing manual ;-)?

DeddyH 10. Nov 2011 18:28

AW: file of char delphi7 geht nicht
 
Da haben sich jetzt Deine Antwort und mein Edit überschnitten ;)

lecomte 10. Nov 2011 18:38

AW: file of char delphi7 geht nicht
 
Zitat:

Zitat von jbg (Beitrag 1135382)
Zitat:

ergibt aber in delphi nur laufzeitfehler.
Der da wäre?

Sorry - ich hab den Laufzeitfehler in allen Varianten ohnehin gegoogelt - ohne Ergebnis. Hier ist er :
Access violation ad address 0045393B in module 'eudorap.exe'. Write of address 00088A3C

DeddyH 10. Nov 2011 18:44

AW: file of char delphi7 geht nicht
 
Dann lass Dir doch zwischendurch mal Length(mess) und Length(st) ausgeben, ich möchte wetten, dass sie kürzer sind, als Du glaubst. Du versuchst somit hinter dem String zu operieren.

Uwe Raabe 10. Nov 2011 18:56

AW: file of char delphi7 geht nicht
 
Es gibt allerdings noch einen großen Unterschied zwischen Turbo Pascal und Delphi: Turbo Pascal verwendet sogenannte ShortStrings, denen man bei der Deklaration eine maximale Länge mitgibt, z.B.
Delphi-Quellcode:
string[80]
. Läßt man diese Längenangabe weg
Delphi-Quellcode:
string
, wird dort implizit 255 angenommen. Die Typangabe
Delphi-Quellcode:
string
in Delphi bedeutet aber einen null-terminierten String, dessen Länge durch den ersten #0 Char bestimmt wird. Damit entspricht das Ergebnis des ersten Copy-Befehls mit aller Wahrscheinlichkeit nicht den Erwartungen.

Sollte es tatsächlich daran liegen, wäre eine Änderung der Zeile
Delphi-Quellcode:
var st,mess:string;

in
Delphi-Quellcode:
var st,mess:string[255];

mal einen Versuch wert.

lecomte 10. Nov 2011 18:58

AW: file of char delphi7 geht nicht
 
Danke für Deinen Kommentar.

nein, mess ist 218 lang, wie geplant, und st ist 31 lang, wie geplant.

ich habe inzwischen dein programm laufen lassen (mit dem filestream).
Ergebnis: eine Riesenmenge Leerzeichen. Showmessage ist - geschätzte, weil nicht sichtbar machbare - 40 bildschirmseiten groß ;-).

Summa summarum: kann es an Windows XP liegen?
Sollte ich mir einen Apple kaufen?
Soll ich meine Unix-Kenntnisse auffrischen?
Kennt jemand außer mir VMS?
UCSD?
Android lernen?
Oder einfach resignieren und PacMan spielen?

Jedenfalls danke für die Hilfe....

lecomte 10. Nov 2011 19:00

AW: file of char delphi7 geht nicht
 
Zitat:

in
Delphi-Quellcode:
var st,mess:string[255];

mal einen Versuch wert.
Das mit der Länge (bis zu 2 GB bei Delphi) war mir ohnehin klar. Danke für den Hinweis.

Uwe Raabe 10. Nov 2011 19:12

AW: file of char delphi7 geht nicht
 
Zitat:

Zitat von lecomte (Beitrag 1135574)
Kennt jemand außer mir VMS?
UCSD?

Aber sicher!

Du könntest aber auch mal die Datei als ZIP hier hochladen, damit wir mit denselben Karten spielen.

lecomte 10. Nov 2011 20:10

AW: file of char delphi7 geht nicht
 
Danke für das Angebot. Ich habe auch dran gedacht, die Datei hochzuladen. Es handelt sich aber um private mails, die ich natürlich nicht weitergeben will.
Andere Daten (als private) hab ich leider nicht.

Aber ich freue mich, Dein / Eure Hilfsangebote bekommen zu haben.... da fühl ich mich nicht mehr ganz so allein ;-).... Und werd' vielleicht demnächst mit der Frage auftauchen, wieso meine pop3-versuche auch mit fehlern enden. Man wird sehen.

Danke jedenfalls!

implementation 10. Nov 2011 20:50

AW: file of char delphi7 geht nicht
 
Zitat:

Zitat von lecomte (Beitrag 1135574)
Soll ich meine Unix-Kenntnisse auffrischen?

Kann nie schaden :mrgreen:

Dann fällt die Nutzung von GNU, BSD und Solaris auch einfacher ;)

jaenicke 10. Nov 2011 20:55

AW: file of char delphi7 geht nicht
 
Zitat:

Zitat von lecomte (Beitrag 1135569)
wie lese ich aus der datei "inbox.toc" die ersten 322 zeichen heraus (die datei ist deutlich länger als 322) und übertrage die zeichen 122 bis 153 auf einen string?

Welche Zeichen willst du nun? Nur die 32 genannten oder die ersten 322? Die genannten Zeichen:
Delphi-Quellcode:
var
  FileContents: TFileStream;
  MailData: AnsiString;
begin
  FileContents := TFileStream.Create(ExtractFilePath(ParamStr(0)) + 'inbox.toc', fmOpenRead);
  try
    FileContents.Position := 122;
    SetLength(MailData, 32);
    FileContents.ReadBuffer(Pointer(MailData), 32);
    ShowMessage(string(MailData));
  finally
    FileContents.Free;
  end;

DeddyH 11. Nov 2011 07:15

AW: file of char delphi7 geht nicht
 
Meine Testdatei hatte den Inhalt A-K #0 L-Z. Eine Änderung auf Shortstring (=> string[255]) war nicht zielführend. Erst das Umstellen auf Streams brachte dann das gewünschte Ergebnis, da sich diese nicht um #0 und Konsorten scheren. Übrigens:
Zitat:

Delphi-Quellcode:
SetLength(MailData, 32);
FileContents.ReadBuffer(Pointer(MailData), 32);

Es wäre vielleicht weniger fehleranfällig, wenn man das so machte:
Delphi-Quellcode:
const
  LENGTH_REQUIRED = 32;
begin
  ...
  SetLength(MailData, LENGTH_REQUIRED);
  FileContents.ReadBuffer(Pointer(MailData), Length(MailData));


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz