Program wpada w nieskończoną pętle while oraz nie wyświetla zawartosci pliku txt.

0

Witam, piszę zaliczenia na programowanie, w którym to program pobiera pytania do testu z pliku txt.
Jednak po skompilowaniu program wpada w nieskończoną pętle oraz nie wyświetla zawartości pliku txt.
Według mnie program powinien działać. Mógłbym ustawić na sztywno pytania w środku exe, jednak według mnie ładniej będzie wyglądało, gdy będzie można ładnie edytować pytania.

program lospyt;
uses
  crt;
var
  x, y, z, w, g, d: LongInt ;
  a: String;
  Plik: Text;
begin
  writeln('Sprawdzenie czy program działa');
  readln;
  assign(Plik,'pytania.txt');
  reset(Plik);

  while not eof(Plik) do
  begin
    writeln('Sprawdzenie petli');
    read(Plik,a);
    writeln(a); // w tym miejscu wyświetla pusty wiersz, a powinien to co znajduje sie w pliku
  end;

  readln;
  close(Plik);
end.

Mam nadzieję, iż ktoś wytłumaczy mi gdzie popełniłem błąd.
Plik txt oczywiście jest zapełniony.

sformatowanie kodu - fp

1

Zamień read(plik,a); na readln(plik,a);

0

Dzięki, strasznie prosty błąd, a się męczę z tym od 2 godzin.
Mam jeszcze jedno pytanie.
Czy lepiej, aby na początku programu z pliku txt dane(pytania,odpowiedzi zostały wczytane do tablicy, czy na bieżąco szukało w pliku po wylosowaniu pytania?

0

Pod jakim kątem lepiej?

0

Mniejsze ryzyko wystąpienia błędu, szybkość działania.

0

Wedle mnie lepiej faktycznie załadować to do dynamicznej tablicy, na przykład typu rekordowego z treścią pytania i poprawną odpowiedzią i/lub możliwymi odpowiedziami, jeśli to będzie test. Ponieważ unikamy choćby błędu jakby plik nagle zniknął itp.

0

@Michalk001 - jeśli danych jest mało (np. kilkadziesiąt linii) to wygodniej będzie cały plik załadować do pamięci, niż bawić się we wczytywanie tylko wybranych linii; Do tego celu znów wygodniej wykorzystać klasę TStringList, niż macierz dynamiczną;

Jeśli danych jest masa (tysiące lub dziesiątki tysięcy linii) to można wczytywać jedynie wybrane linie, ale tutaj wygodniej było by skorzystać z plików typowanych, ponieważ łatwiej będzie się po ich zawartości poruszać - proste obliczenia (+ Seek) wystarczą do przesunięcia kursora w odpowiednie miejsce.

0

Mam nadzieję, iż sa to moje 2 ostatie pytania.

  1. Czy jest możliwośc, aby pascal po wczytaniu tekstu z pliku nie wyświetlał krzaków zamiast polskich znaków?
  2. Czy trzymania tekstu menu w tablicy jest dobrym posunięciem? Dla mnie szybciej pisze się, gdy tekst menu wrzucę do tablicy, a menu jest wyświetlane jedną procedurą z parametrem, gdzie określam z jakiego wiersza w tablicy ma być wyświetlony tekst.
0

Ad.1. Masz dwie możliwości: pierwsze - zapisać plik w odpowiednim kodowaniu, drugie - po odczytaniu skonwertować.
Ad.2. Najlepsze rozwiązanie to tablica struktur.

type
  PMenu=^TMenu;
  TProc=procedure(menu:PMenu);
  TMenu=record
    Text:String;
    Proc:TProc;
    Menu:PMenu;
  end;

procedure RunMenu(menu:PMenu);
var P,N:Word;
var tmp:PMenu;
begin
  while true do
  begin
    N:=1;
    tmp:=menu;
    while tmp^.Proc<>nil do
    begin
      WriteLn(N,': ',tmp^.Text);
      tmp:=tmp+1;
      Inc(N);
    end;
    WriteLn('0: ',tmp^.Text);
    Write('Wybór: ');
    ReadLn(P);
    if P<N then
    begin
      if P=0 then Exit;
      tmp:=menu+(P-1);
      WriteLn;
      WriteLn('Wybrano menu: ',tmp^.Text);
      tmp^.Proc(tmp^.Menu);
      WriteLn;
    end
    else WriteLn('Nie ma takiej opcji');
  end;
end;

procedure Dodaj(menu:PMenu);
begin
  WriteLn('Dodawanie');
end;

procedure Pokaz(menu:PMenu);
begin
  WriteLn('Pokazywanie');
end;

procedure Usun(menu:PMenu);
begin
  WriteLn('Usuwanie');
end;

procedure SortBy1(menu:PMenu);
begin
  WriteLn('Sortowanie Wg 1-go parametru');
end;

procedure SortBy2(menu:PMenu);
begin
  WriteLn('Sortowanie Wg 2-go parametru');
end;

const Sort:array[0..2]of TMenu=
(
  (Text:'Sortuj wg 1';Proc:@SortBy1),
  (Text:'Sortuj wg 2';Proc:@SortBy2),
  (Text:'Wróć';Proc:nil)
);

const Main:array[0..4]of TMenu=
(
  (Text:'Dodaj';Proc:@Dodaj),
  (Text:'Sortuj';Proc:@RunMenu;Menu:@Sort[0]),
  (Text:'Pokaż';Proc:@Pokaz),
  (Text:'Usuń';Proc:@Usun),
  (Text:'Koniec';Proc:nil)
);

begin
  RunMenu(@Main[0]);
end.

http://ideone.com/YL9e28

0
Michalk001 napisał(a)
  1. Czy jest możliwośc, aby pascal po wczytaniu tekstu z pliku nie wyświetlał krzaków zamiast polskich znaków?

Język tutaj nie ma znaczenia, bo zapewne chodzi Tobie o to, że uruchamiając program w konsoli polskie znaki diakrytyczne nie są wyświetlane poprawnie; Tutaj jest podana tabela znaków z przedziału 128 .. 255 - tak będą wyglądać w konsoli;

Michalk001 napisał(a)
  1. Czy trzymania tekstu menu w tablicy jest dobrym posunięciem?

W każdym razie nie jest złym, a jeśli wygodnie jest Ci pakować dane do tablicy i na niej operować to je właśnie wykorzystaj.

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