Problem z wypisaniem danych z file of record;

0

Mam problem i licze na waszą pomoc. Staram sie storzyc plik z danymi do logowania i chyba nie do konca rozumiem jak działac na takich typach plików:/. Problem polega na tym że wypisuje mi tylko 5 ostatnich rekordow:/
Na dodatek gdy dopisze writeln np. po read to za kazdym razem po wypisaniu danych dopisze mi kolejną linijke z haslem, czyli po 5 probach wypisania danych na początku pojawi mi sie 5 razy haslo, po czym pojawi się na ekranie 5 ostatnich rekordów:( a to tylko fragment mojego programu, który dopiero zaczynam pisać. Uzywam Free Pascala, poniewaz lazarus wyswietla mi error przy uruchamianu tego programu:/

program project1;
uses crt;
const
    logintxt='D:\login.txt';
type
    DaneLogowania=record
        Login:string;
        Haslo:string;
        upr:integer;
        nrucznia:integer;
    end;
var
pliklogin:file of danelogowania;
WypisywanyRekord:danelogowania;
begin
assign(pliklogin,logintxt);
reset(pliklogin);
Seek(pliklogin,0);
while not eof(pliklogin) do
begin
     read(pliklogin, WypisywanyRekord);
     writeln(WypisywanyRekord.Login);
     writeln(WypisywanyRekord.Haslo);
     writeln(WypisywanyRekord.upr);
     writeln(WypisywanyRekord.nrucznia);

end;
close(pliklogin);
readln;
end.
0

Z tego co widzę kod odczytu wygląda na poprawny poza jednym mankamentem. Musi być ograniczona długość łańcucha czyli tak jak podaję w przykładzie poniżej. Oczywiście to 25 to przykład, musi być taka wartość z jaką był zapisany plik aby program mógł go poprawnie odczytać.

type
    DaneLogowania=record
        Login:string[25];
        Haslo:string[25];
        upr:integer;
        nrucznia:integer;
    end;
0

Czy dlugość lańcucha musi być dokladnie taka jak dlugość loginu, czy moze byc wieksza, po wpisaniu jakiejkolwiek wartosci dla dlugości lancucha, wypisuje mi cos takiego:( Pytanie wydaje sie dosc głupie, ale ja juz nie mam pojecie co sie dzieje:(

wybacz zapomnialem o linku

http://imageshack.us/photo/my-images/638/beztytuuhoh.png/

0

Pokaż najlepiej cały kod, a jeżeli jest dość długi wklej go na jakiś pastebin. Ja dodam tylko, że jeżeli korzystasz z FPC/Delphi i nie chcesz mieć ograniczonej sztywno długości stringów na przykład do 20 znaków to zapisuj również ich długośc przy tworzeniu pliku oraz odcztyuj przy ładowaniu. Krótki przykład masz poniżej.

program example2;

{$APPTYPE CONSOLE}

const
  MaxCnt = 6;
  AFileName = 'D:\test_2.bin';
  TxtArr : array[1..MaxCnt] of string = ('ucz', 'sie', 'podstaw', 'i', 'kombinuj', 'sam.');
var
  S : string;
  AFile : File of Byte;
  I, TxtLength, RecCnt : integer;
  DataArr : array[1..MaxCnt] of string;
begin
  for I := Low(DataArr) to High(DataArr) do
    DataArr[I] := TxtArr[I];
  // Zapis
  RecCnt := Length(DataArr);
  Assign(AFile, AFileName);
  Rewrite(AFile);
  BlockWrite(AFile, RecCnt, SizeOf(RecCnt));
  for I := Low(DataArr) to High(DataArr) do
  begin
    TxtLength := Length(DataArr[I]);
    BlockWrite(AFile, TxtLength, SizeOf(TxtLength));
    BlockWrite(AFile, DataArr[I][1], TxtLength);
  end;
  Close(AFile);
  // Odczyt
  Assign(AFile, AFileName);
  Reset(AFile);
  BlockRead(AFile, RecCnt, SizeOf(RecCnt));
  for I := 1 to RecCnt do
  begin
    BlockRead(AFile, TxtLength, SizeOf(TxtLength));
    SetLength(S, TxtLength);
    BlockRead(AFile, S[1], TxtLength);
    Writeln(S);
  end;
  Close(AFile);
  Readln;
end.
0

W sumie wykorzystywana jest jeszcze tylko funkcja dodawania loginu hasla itd, o to kod:
[code]
procedure dodanieuprawnienia(IdUcznia:integer);
var
pliklogin:file of danelogowania;
LogDoDodania:danelogowania;
uprawnieniedododania:string;
istnieje:boolean;
begin
clrscr;
repeat
writeln('podaj login do zapisu');
readln(LogDoDodania.login);
sprawdzczyjestlogin(LogDoDodania.login, istnieje);
until istnieje=false ;
writeln('podaj haslo do zapisu');
readln(LogDoDodania.Haslo);
repeat
writeln('podaj uprawnienie 1-dla nauczyciela, 2-dla rodzica');
uprawnieniedododania:=readkey;
until (uprawnieniedododania='1') or (uprawnieniedododania='2');
val(uprawnieniedododania, LogDoDodania.upr);
if uprawnieniedododania='2' then
begin
LogDoDodania.Nrucznia:=IdUcznia;
end
else
LogDoDodania.Nrucznia:=0;
assign(pliklogin,logintxt);
reset(pliklogin);
Seek(pliklogin, FileSize(pliklogin));
write(pliklogin,LogDoDodania);
close(pliklogin);
writeln('login i haslo zostaly zapisane, wcisnij dowolny klawisz');
readkey;

end;
[/code]

0

Ale chyba dlugość loginu czy hasła nie musi być dokładnie taka jak dlugość lańcucha jaką podaliśmy, może być krótsza, prawda?czy jestem w błędzie?

0

Prawda może być krótsza, ale na przykład przy string[20]; nie może być dłuższa niż 20 znaków, jednak zrzut ekranu który pokazałeś sugeruje, że albo w swoim pliku rekordowym masz zapisane jakieś "śmieci" lub niewłaściwe dane pokazane jako losowe znaczki ASCII albo czytasz poza rekordem czy plikiem. Jednak to tylko gdybanie, najlepiej pokaż sformatowany po ludzku kod wstawiony w znaczniki <delphi>.

0

nie do kona rozumiem co znaczy sformatowany po ludzku, w sumie wykorzystuje tylko to co wstawilem. z tym ze pierwszy fragment wstawiony jest w kolejną procedure, tak wiec mam procedure ktora wpisuje dane do pliku i ktora stara sie je wypisac.

0

Nie umiesz formatować "po ludzku" kodu to użyj dodatku GExperts dla Delphi, a później wypakuj do zainstalowanego katalogu z nim (przy wyłączonym IDE Delphi) zmodyfikowaną wersją alternatywną z formatterem kodu - wszystko to jest do znalezienia na google. Polecam takie ustawienia jak poniżej wklejam importowane z pliku w stylu delforexoptions.ini. A kod wstawiaj w znaczniki <code class="delphi"> oraz </code></code>, to kod będzie o wiele bardziej czytelniejszy niż w <code><code>. A i mogę się mylić, ale we fragmencie jaki wkleiłeś - nie widzę błedu raczej, najlepiej było by wkleić cały kod na jakiś PasteBin albo spakować rarem i dołączyć do posta, ale to byś musiał się chyba zarejestrować tutaj, co polecam zrobić, bo będziesz mógł chociażby później edytować swoje posty. Bo jeśli nie ja, to oczywiście ktoś inny może da radę wywrózyć co tam masz źle w swoim kodzie po tym fragmencie, jaki przytoczyłeś.

[settings]
SpaceOperators=3
SpaceColon=3
SpaceSemiColon=2
SpaceComma=2
SpaceLeftBr=0
SpaceRightBr=0
SpaceLeftHook=0
SpaceRightHook=0
SpaceEqualOper=3
UpperCompDirectives=1
UpperNumbers=1
ReservedCase=0
StandDirectivesCase=0
ChangeIndent=1
NoIndentElseIf=0
IndentBegin=0
IndentTry=1
IndentTryElse=0
IndentCaseElse=0
IndentComments=1
IndentCompDirectives=0
BlankProc=1
BlankSubProc=0
RemoveDoubleBlank=1
SpacePerIndent=2
FeedRoundBegin=2
FeedRoundTry=2
FeedBeforeEnd=1
FeedAfterThen=1
ExceptSingle=0
FeedAfterVar=1
FeedEachUnit=0
NoFeedBeforeThen=1
FeedElseIf=1
FillNewWords=0
FeedAfterSemiColon=1
StartCommentOut={(*}
EndCommentOut={*)}
CommentFunction=0
CommentUnit=0
WrapLines=0
WrapPosition=81
AlignCommentPos=40
AlignComments=0
AlignVarPos=20
AlignVar=0
Precedence1=0
Precedence2=1
Precedence3=2
ShowDoneDialog=0
UseCapitalizationFile=0
CapitalizationFile=

[Capitalization]
Count=0
0

Uzylem SourceFormatX, mam nadzieje ze teraz jest bardziej czytelne. Przeksztalcilem moj program tak aby zostaly tylko uzywane procedury.

program project1;

uses crt;

const

  logintxt = 'D:\login.txt';

type

  DaneLogowania = record
    Login: string;
    Haslo: string;
    upr: Integer;
    nrucznia: Integer;
  end;

var
  uprawnienie: Integer;
  numerucznia: Integer;

procedure sprawdzczyjestlogin(sprlogin: string; var istnieje: Boolean);
var
  pliklogin: file of danelogowania;
  SprawdzanyRekord: DaneLogowania;
begin
  clrscr;
  istnieje := false;
  Assign(pliklogin, logintxt);
  Reset(pliklogin);
  while not Eof(pliklogin) do
  begin
    Read(pliklogin, SprawdzanyRekord);
    if SprawdzanyRekord.Login = sprlogin then
    begin
      istnieje := true;
      Writeln('podany login istnieje, podaj inny');
      Break;
    end;
  end;
  Close(pliklogin);
end;

procedure dodanieuprawnienia(IdUcznia: Integer);
var
  pliklogin: file of danelogowania;
  LogDoDodania: danelogowania;
  uprawnieniedododania: string;
  istnieje: Boolean;
begin
  clrscr;
  repeat
    Writeln('podaj login do zapisu');
    Readln(LogDoDodania.login);
    sprawdzczyjestlogin(LogDoDodania.login, istnieje);
  until istnieje = false;
  Writeln('podaj haslo do zapisu');
  Readln(LogDoDodania.Haslo);
  repeat
    Writeln('podaj uprawnienie 1-dla nauczyciela, 2-dla rodzica');
    uprawnieniedododania := readkey;
  until (uprawnieniedododania = '1') or (uprawnieniedododania = '2');
  Val(uprawnieniedododania, LogDoDodania.upr);
  if uprawnieniedododania = '2' then
  begin
    LogDoDodania.Nrucznia := IdUcznia;
  end
  else
    LogDoDodania.Nrucznia := 0;
  Assign(pliklogin, logintxt);
  Reset(pliklogin);
  Seek(pliklogin, FileSize(pliklogin));
  Write(pliklogin, LogDoDodania);
  Close(pliklogin);
  Writeln('login i haslo zostaly zapisane, wcisnij dowolny klawisz');
  readkey;
end;

procedure wypiszloginy;
var
  pliklogin: file of danelogowania;
  WypisywanyRekord: danelogowania;
begin
  Assign(pliklogin, logintxt);
  Reset(pliklogin);
  while not Eof(pliklogin) do
  begin
    Read(pliklogin, WypisywanyRekord);
    Writeln(WypisywanyRekord.Login);
    Writeln(WypisywanyRekord.Haslo);
    Writeln(WypisywanyRekord.upr);
    Writeln(WypisywanyRekord.nrucznia);
  end;
  Close(pliklogin);
end;


begin
  clrscr;

  wypiszloginy;

  Readln;
end.
0

No to problem rozwiazany i temat do zamkniecia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1