| Autor |
Beitrag |
crandzy
      
Beiträge: 42
WIN 2000
D2006 Prof
|
Verfasst: Di 20.09.05 08:28
Hallo
ich habe Daten aus einer Datei mit TFileStream in einen String geladen (ReadBuffer). Aber wie kann ich diesen String wieder in der Datei speichern. Mit WriteBuffer hab ichs schon versucht aber der speichert mir irgentwie den String nicht...
Hat jemand eine Idee
MfG Moderiert von Gausi: Topic aus Sonstiges verschoben am Di 20.09.2005 um 09:37
_________________ In Wirklichkeit ist die Realität ganz anders
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Di 20.09.05 08:36
So gehts z.B.
Stream.Write(PChar(MeinString)^,length(MeinString)); Oder auch so:
Delphi-Quelltext 1:
| Stream.WriteBuffer(MeinString[0],length(MeinString)); |
Write und WriteBuffer kann man da auch tauschen - das eine wird sowieso von dem anderen aufgerufen. Mehr dazu (und was man besser verwenden sollte) steht in der Hilfe.
_________________ We are, we were and will not be.
|
|
crandzy 
      
Beiträge: 42
WIN 2000
D2006 Prof
|
Verfasst: Di 20.09.05 08:51
Funktioniert nicht...
Kann das vielleicht auch daran liegen das ich den FileStream mit fmOpenReadWrite erstellt habe. Dürfte aber eigentlich nichts ausmachen, oda?
_________________ In Wirklichkeit ist die Realität ganz anders
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Di 20.09.05 09:02
Komisch. Bei mir geht das so.
Zeig mal, wie du das komplett machst - so kann man da schwer mehr zu sagen.
_________________ We are, we were and will not be.
|
|
crandzy 
      
Beiträge: 42
WIN 2000
D2006 Prof
|
Verfasst: Di 20.09.05 09:13
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70:
| program crlf;
{$APPTYPE CONSOLE}
uses SysUtils, Classes;
var text,pfad : string; Files : TFileStream; i,j,StrLen:integer; zeichen : char;
begin j:=0; pfad := ParamStr(1); Files := TFileStream.Create('c:\testpro\01-07-2005_21-51_MedrucPro.4dp',fmOpenreadwrite or fmShareDenyWrite); Files.Position := 0; while files.Position < files.Size do begin Files.ReadBuffer(zeichen,sizeof(zeichen)); text := text+zeichen; zeichen := #000; end;
for i := 0 to length(text)-1 do begin if text[i]=#13 then begin if (text[i+1]=#13)and(text[i+1]<>#10)then begin while (text[i+1]=#13) or (text[i+1]=#10) do Delete(text,i,1); Insert(#10,text,i+1); Writeln('Zeichen '+inttostr(i)+ ' wurde berichtigt/Bereich1'); j:=j+1; end else if (text[i+1]<>#10)and(text[i+1]<>#13) then begin insert(#10,text,i+1); Writeln('Zeichen '+inttostr(i)+ ' wurde berichtigt/Bereich2'); j:=j+1; end; end else if text[i]=#10 then begin if ((text[i+1]=#13)or(text[i+1]=#10))and(text[i-1]<>#13)then begin while (text[i+1]=#13)or(text[i+1]=#10)do Delete(text,i,1); Insert(#13,text,i); Writeln('Zeichen '+inttostr(i)+ ' wurde berichtigt/Bereich3'); j:=j+1; end else if ((text[i+1]<>#13)or(text[i+1]<>#10))and(text[i-1]<>#13)then begin insert(#13,text,i); Writeln('Zeichen '+inttostr(i)+ ' wurde berichtigt/Bereich4'); j:=j+1; end; end; end; files.WriteBuffer(text[1],length(text)); files.Free; Writeln('Vorgang abgeschlossen - Es wurden '+inttostr(j)+' Zeichen berichtigt'); end. |
Das ist momentan noch alles. Ich nehm an das es mit dem Speichern auch so funktioniert allerdings hab ich meinen Filestream auf Modifikation (fmopenreadwrite) gesetzt und dann wird der String ja immer wieder angehängt. Kann man das dann auch irgentwie so machen das der Inhalt der Datei mit dem neuen String ersetzt wird
mfg
_________________ In Wirklichkeit ist die Realität ganz anders
|
|
crandzy 
      
Beiträge: 42
WIN 2000
D2006 Prof
|
Verfasst: Di 20.09.05 09:57
Ich habs gefunden, man muss die Streamposition auf 0 setzen dann funktionierts. Allerdings wenn ich dann die Datei öffne, dann werden am anfang der Datei noch irgendwelche Zeichen mit hinein geschrieben. Woran kann das liegen???
mfg
_________________ In Wirklichkeit ist die Realität ganz anders
|
|
Grishnak
      
Beiträge: 221
Windows XP Home
Delphi 7 PE, Delphi 2005 PE
|
Verfasst: Di 20.09.05 10:24
Vielleicht so (ungetestet!)?
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70:
| program crlf;
{$APPTYPE CONSOLE}
uses SysUtils, Classes;
var text, pfad: string; Files: TFileStream; i, j, StrLen :integer; zeichen: char;
begin j:=0; pfad:=ParamStr(1);
Files:=TFileStream.Create('c:\testpro\01-07-2005_21-51_MedrucPro.4dp',fmOpenreadwrite or eDenyWrite);
SetLength(text, Files.Size); Files.ReadBuffer(text[1], Files.Size);
for i:=1 to Length(text) do case text[i] of #13: if (text[i+1] = #13) or (text[i+1] = #10) then begin while (text[i+1] = #13) or (text[i+1] = #10) do Delete(text, i+1, 1); Insert(#10, text, i+1); WriteLn('Zeichen '+IntToStr(i)+' wurde berichtigt/Bereich1'); Inc(j); end else if (text[i+1] <> #10) and (text[i+1] <> #13) then begin Insert(#10, text, i+1); WriteLn('Zeichen '+IntToStr(i)+' wurde berichtigt/Bereich2'); Inc(j); end; #10: if ((text[i+1] = #13) or (text[i+1] = #10)) and (text[i-1] <> #13) then begin while (text[i+1] = #13) or (text[i+1] = #10) do Delete(text, i, 1); Insert(#13, text, i-1); WriteLn('Zeichen '+IntToStr(i)+' wurde berichtigt/Bereich3'); Inc(j); end else if ((text[i+1] <> #13) or (text[i+1] <> #10)) and (text[i-1] <> #13) then begin Insert(#13, text, i-1); WriteLn('Zeichen '+IntToStr(i)+' wurde berichtigt/Bereich4'); Inc(j); end; end;
Files.Position:=0; Files.WriteBuffer(text[1], Length(text));
FreeAndNil(Files)
Writeln('Vorgang abgeschlossen - Es wurden '+IntToStr(j)+' Zeichen berichtigt'); end. |
Wenn ich dein Programm richtig verstehe, willst du eine Datei nach #13 bzw. #10 durchsuchen und sicherstellen, dass
- nicht mehrere #13 bzw. #10 hintereinander stehen
- jedem #13 ein #10 folgt bzw. jedem #10 ein #13 voransteht
Richtig?
_________________ Mach' etwas idiotensicher und irgendjemand erfindet einen besseren Idioten!
|
|
crandzy 
      
Beiträge: 42
WIN 2000
D2006 Prof
|
Verfasst: Di 20.09.05 11:03
Ja richtig,
es war schon der Fehler mit der Streamposition.. die hab ich dann auf 0 gestzt und dann gings.
Die "komischen Zeichen" die am Anfang der Datei hinzugefügt wurden, kommen etz auch nicht mehr. (Die hab ich anscheinend mit einer Funktion selber reingeschrieben und habs nicht gemerkt
Deine Version Funktioniert vom Speichern her genauso, das laden werd ich übernehmen, dann spar ich mir eine Schleife...
Vielen Dank etz komm ich weiter
mfg
_________________ In Wirklichkeit ist die Realität ganz anders
|
|
|