Entwickler-Ecke

Dateizugriff - Bestimmte Stellenl aus ner Datei auslesen, wie mach ich das?


del1312 - Do 19.06.03 10:26
Titel: Bestimmte Stellenl aus ner Datei auslesen, wie mach ich das?
Hi Leute, hab mal folgende Frage:

Ich hab z.B ne Datei mit folgendem Inhalt:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
.
.
.
r1::600:u1,u2,u2
r2::600:u1,u2,u2
r3::600:u1,u2,u2
r4::600:u1,u2,u2
.
.
.


Ich hab nun nen Programm, wo ein User sich als z.B r1 dentifiziert
und in einer listbox soll nun die auswahl stehen:
u1
u2
u3

wie lese ich aus der datei? kann mir dabei bitte einer helfen?
[/list]


Tino - Do 19.06.03 10:55

Hallo,

ich nehme mal an das u1 u2 u2 in der Listbox erscheinen soll weil diese ein der gleichen Zeile stehen wie r1, oder?

Lad die ganze Datei am besten in eine StringList (tStringList) und gehe mit einer For-Next-Schleife die Datei durch und suche nach r1 am Anfang (mit der Anweisung Copy). Hast Du die Zeile gefunden kannst du wiederum mit der Anweisung Copy die einzelnen Teile aus dem String rausholen und diese der ListBox hinzufügen.

Gruß
Tino


del1312 - Do 19.06.03 11:14

ja genau die sollen dann dort in der listbox erscheinen. hm wie mach ich das mit der stringlist und der next schleife? sorry wenn ich frag aber ich fummel mich grad durch delphi und lern noch :oops:


Tweafis - Do 19.06.03 11:30

http://www.delphi-forum.de/viewtopic.php?p=45780#45780

Du nimmst Explode und durhcläufst die Datei mit


Delphi-Quelltext
1:
2:
3:
4:
while not(explode('::', aktZeile)[0] = aktUser or eof(datei)) do {nächste Zeile in aktZeile auslesen};
aktUserArray := explode('::', aktZeile);

for x:=1 to High(aktUserArray) do Listbox1.Items.Add(aktUserArray[x]);


aktUser ist der aktuelle User.


del1312 - Do 19.06.03 11:55

hm aber der ließt nicht die zeile dann aus sonder die ganze datei oder? ich will nur das wenn der user sich als r1 identifiziert nur die zeile r1 ausgelesen wird und in der listbox dann halt angezeigt wird:
u1
u2
u3


Tweafis - Do 19.06.03 11:57

er muss ja die ganze datei auslesen, woher soll er sonst wissen in welcher zeile dein user steht? Bei meiner lösung liest er solange aus bis eine zeile kommt die mit deinem user beginnt (aktUser) und mit dieser kannst du dann weiterarbeiten.


del1312 - Do 19.06.03 14:21

komme nicht weiter, kann damit irgendwie nichts anfangen :( kann mir nicht einer ein wenig erklären wie genau das geht?


Tweafis - Do 19.06.03 14:34

Hast du den Code den ich oben gepostet habe schon getestet?


del1312 - Do 19.06.03 14:50

ja aber so richtig weiss ich nicht wie ich ihn einbauen soll. hab folgendes gemacht:

Hab nen Button der bei Klick das hier ausführt:


Quelltext
1:
2:
3:
4:
while not(explode('::', aktZeile)[0] = aktUser or eof(datei)) do {nächste Zeile in aktZeile auslesen}; 
aktUserArray := explode('::', aktZeile); 

for x:=1 to High(aktUserArray) do Listbox1.Items.Add(aktUserArray[x]);



Dann hab ich unter :

Quelltext
1:
2:
3:
4:
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);


das hier mit eingetragen:

Quelltext
1:
TStringDynArray = array of string;                    


und die komplette Explode Funnktion

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:
function Explode(const Separator, S: string; Limit: Integer = 0): TStringDynArray; 
var 
  SepLen: Integer; 
  F, P: PChar; 
  ALen, Index: Integer; 
begin 
  SetLength(Result, 0); 
  if (S = '') or (Limit < 0) then Exit; 
  if Separator = '' then 
  begin 
    SetLength(Result, 1); 
    Result[0] := S; 
    Exit; 
  end; 
  SepLen := Length(Separator); 
  ALen := Limit; 
  SetLength(Result, ALen); 

  Index := 0; 
  P := PChar(S); 
  while P^ <> #0 do 
  begin 
    F := P; 
    P := StrPos(P, PChar(Separator)); 
    if (P = nil) or ((Limit > 0) and (Index = Limit - 1)) then P := StrEnd(F); 
    if Index >= ALen then 
    begin 
      Inc(ALen, 5); // mehrere auf einmal um schneller arbeiten zu können 
      SetLength(Result, ALen); 
    end; 
    SetString(Result[Index], F, P - F); 
    Inc(Index); 
    if P^ <> #0 then Inc(P, SepLen); 
  end; 
  if Index < ALen then SetLength(Result, Index); // wirkliche Länge festlegen 
end;


eingefügt vor:

Quelltext
1:
end.                    


aber ich nehme an ich hab da den totalen blödsinn zusammengeschustert oder ??? :oops:


kiwicht - Do 19.06.03 15:29

ähm, ich hab noch ne andere Idee:
Was hälst du von einer Ini-Datein, bzw. der Verwendung der Registry?

Deine Ini sähe dann z.B so aus:

Zitat:
[r1]
var1=u1
var2=u2
var3=u3

etc. pp.


und du brauchst dir nicht solche Mühe beim auslesen machen, weil du einfach nur sagts:


Quelltext
1:
myvar := ini.ReadString(edit1.text, var1);                    
und in edit1 steht dann eben der nutzername...

ist es das?

mfG


del1312 - Do 19.06.03 19:05

nee leider nicht, weil die user (u1, u2, u2) variabel sind, die sind nicht festgelegt. es ist einfach so. da ist ne unix group datei. und die gruppenleiter (r1,r2,r3) sollen die ihre gruppe auslesen können und dann eben die user (u1,u2,u3) hinzufügen oder löschen können.


kiwicht - Do 19.06.03 22:29

hm.. und wenn du es ungfähr so machst:

Zitat:
Ini:

[r1]
sum='3'
u1='xxx'
u2='xxx'
u3='xxx'


Willst du jetzt einen neuen User anlegen, fragst du erst die Ini ab, wieviele es schon gibt ("SUM" auslesen), und kannst dann, diesen Wert mit 1 inkrementiert, einen neune User anlegen.

Also für u4 einmal den Schlüssel, und ausserdem den SUM-Wert um u4 ergänzen.

Beim Löschen halt genau anders rum.

Und das Auslesen dürfte dann ja klar sein...

meinste nicht? Ich denke das würde auch gehen...

mfG


del1312 - Fr 20.06.03 07:03

hm naja aber ich muss doch nach diesem schema die datei nach der veränderung schreiben: r1::671,u1,2,3,4,5,
und wenn ich das per ini mache dann liest er mir ja nur ne datei aus. wenn der user jetzt an nem anderen rechner sitzt dann findet er die user ja nicht weil diese konfigdatei nur auf dem anderen rechner ist. nee ich glaub die variante mit der ini oder reg geht leider nicht :( trotzdem vielen dank für die tipps. vielleicht kannst du mir aber beim auslesen der datei helfen? wir hatten ja oben schon was aber ich komme da nicht weit.