Autor Beitrag
crandzy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42

WIN 2000
D2006 Prof
BeitragVerfasst: 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 user profile iconGausi: Topic aus Sonstiges verschoben am Di 20.09.2005 um 09:37

_________________
In Wirklichkeit ist die Realität ganz anders
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Di 20.09.05 08:36 
So gehts z.B.
Stream.Write(PChar(MeinString)^,length(MeinString)); Oder auch so:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42

WIN 2000
D2006 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Di 20.09.05 09:02 
Komisch. Bei mir geht das so. :gruebel:
Zeig mal, wie du das komplett machst - so kann man da schwer mehr zu sagen.

_________________
We are, we were and will not be.
crandzy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42

WIN 2000
D2006 Prof
BeitragVerfasst: Di 20.09.05 09:13 
ausblenden volle Höhe Delphi-Quelltext
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
  { TODO -oUser -cConsole Main : Hier Code einfügen }
   j:=0;
   pfad := ParamStr(1);  //Pfad wird übergeben
   Files := TFileStream.Create('c:\testpro\01-07-2005_21-51_MedrucPro.4dp',fmOpenreadwrite     or fmShareDenyWrite);  //Filestream wird erstellt
   Files.Position := 0;
   while files.Position < files.Size do
     begin
       Files.ReadBuffer(zeichen,sizeof(zeichen)); //Datei wird Zeichenweise eingelesen
       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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42

WIN 2000
D2006 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 221

Windows XP Home
Delphi 7 PE, Delphi 2005 PE
BeitragVerfasst: Di 20.09.05 10:24 
Vielleicht so (ungetestet!)?

ausblenden volle Höhe Delphi-Quelltext
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;

{ TODO -oUser -cConsole Main : Hier Code einfügen }

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; // Schreibposition auf Anfang setzten
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42

WIN 2000
D2006 Prof
BeitragVerfasst: 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 :oops:


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