Wczytywanie rekordu z pliku

0

Potrzebuję pilnie pomocy z napisaniem programu mającego zapisać dane o fakturze do pliku, a następnie ich wczytanie, wypisanie na ekran i wyszukanie danego rekordu po nazwisku w środowisku Delphi. Program kompiluje się, ale przy wypisywaniu na ekran danych z pliku po wpisaniu nazwiska pojawia się błąd 'invalid numeric input'.

uses
  SysUtils;

type x=record
      imie:string;
      nazwisko:string;
      data:string;
      iloscartykulow:integer;
      nazwa:array [1..15] of string;
      cena:array [1..15] of integer;
      ilosc:array [1..15] of integer;
      razemart:array [1..15] of integer;
      razemfakt:integer;
     end;
     t=array [1..15] of x;

procedure zapisz(var dane:t; var ilosc2:integer);
var p:text;
    g:integer;
    a:integer;
    i:integer;
    name:string;

begin
name:='faktura.txt';
writeln('Prosze stworzyc plik tekstowy faktura.txt w folderze z programem.');
writeln('Prosze zdeklarowac ile faktur ma zostac wprowadzonych do programu: ');
readln(ilosc2);
writeln('Wprowadzanie danych ',ilosc2,' kupujących: ');
assign(p, name);
append(p);
for i:=1 to ilosc2 do
  begin
  writeln('Imie ',i,' kupujacego: ');
  readln(dane[i].imie);
  writeln(p, dane[i].imie);
  writeln('Nazwisko ',i,' kupujacego: ');
  readln(dane[i].nazwisko);
  writeln(p, dane[i].nazwisko);
  writeln('Data wystawienia faktury ',i,' kupujacego: ');
  readln(dane[i].data);
  writeln(p, dane[i].data);
  writeln('Ile artykulow ma opisywac faktura: ');
  readln(dane[i].iloscartykulow);
  writeln(p, dane[i].iloscartykulow);
  g:=dane[i].iloscartykulow;
  dane[i].razemfakt:=0;
  for a:=1 to g do
    begin
    writeln('Podaj nazwe ',a,' produktu: ');
    readln(dane[i].nazwa[a]);
    writeln(p, dane[i].nazwa[a]);
    writeln('Podaj cene ',a,' produktu: ');
    readln(dane[i].cena[a]);
    writeln(p, dane[i].cena[a]);
    writeln('Podaj ilosc sztuk ',a,' produktu: ');
    readln(dane[i].ilosc[a]);
    writeln(p, dane[i].ilosc[a]);
    dane[i].razemart[a]:=(dane[i].cena[a])*(dane[i].ilosc[a]);
    writeln(p, dane[i].razemart[a]);
    dane[i].razemfakt:=(dane[i].razemfakt)+(dane[i].razemart[a]);
    writeln(p, dane[i].razemfakt);
    end;
  end;
close(p);
end;

procedure szukaj(dane:t; ilosc2:integer);
var p:text;
    i:integer;
    a:integer;
    g:integer;
    q:integer;
    name:string;
    r:string;
    
begin
name:='faktura.txt';
assign(p, name);
reset(p);
i:=1;
repeat
writeln('Czy wyszukac fakture po nazwisku kupujacego? Wpisz 1 (tak) lub 2 (nie)');
readln(q);
while q=1 do
  begin
  writeln('Wpisz nazwisko: ');
  readln(r);
  while not(eof(p)) do
    begin
    readln(p, dane[i].imie);
    readln(p, dane[i].nazwisko);
    readln(p, dane[i].data);
    readln(p, dane[i].iloscartykulow);
    g:=dane[i].iloscartykulow;
    for a:=1 to g do
      begin
      readln(p, dane[i].nazwa[a]);
      readln(p, dane[i].cena[a]);
      readln(p, dane[i].ilosc[a]);
      readln(p, dane[i].razemart[a]);
      end;
    readln(p, dane[i].razemfakt);
    if 'dane[i].nazwisko'='r' then
      begin
      writeln(dane[i].imie);
      writeln(dane[i].nazwisko);
      writeln(dane[i].data);
      writeln(dane[i].iloscartykulow);
      g:=dane[i].iloscartykulow;
      for a:=1 to g do
        begin
        writeln(dane[i].nazwa[a]);
        writeln(dane[i].cena[a]);
        writeln(dane[i].ilosc[a]);
        writeln(dane[i].razemart[a]);
        end;
      writeln(dane[i].razemfakt);
      end;
    i:=i+1;
    end;
  end;
until q=2;
close(p);
end;

var dane2:t;
    ilosc3:integer;

begin
zapisz(dane2, ilosc3);
szukaj(dane2, ilosc3);
readln;
end. 
0
p:text;
    g:integer;
    a:integer;
    i:integer;
    name:string;

Serio?

A przy okazji było:
Zapisywanie rekord do pliku oraz ich odczyt w programie.

Po co szukać jak można zaśmiecać forum.

0

Pierwszym niedopatrzeniem jakie zauważyłem podczas debugowania jest proszenie użytkownika o ręczne stworzenie pliku w katalogu z programem... Co to ma być? Po co każesz mu utworzyć ręcznie plik faktura.txt i po co otwierasz go przez Append nie mając w ogóle pewności, że to uczynił? Ja jak zwykle nie robię tego, o co prosi program i już na samym początku program się rozsypał - nie utworzyłem pliku ręcznie i dostałem wyjątek EInOutError; Wypada to zabezpieczyć - sprawdź czy plik istnieje i jeśli tak - Append, a jeśli nie - ReWrite;

Kolejnym niedopatrzeniem jest ustalenie typu pola przechowującego cenę - dlaczego cena może być jedynie całkowitoliczbowa? Próbuję wpisać 1.50 a tu wyjątek - EInOutError with message 'Invalid numeric input'; Zmień na typ zmiennoprzecinkowy pola: Cena, RazemArt i RazemFakt;

Monoraud napisał(a)

Program kompiluje się, ale przy wypisywaniu na ekran danych z pliku po wpisaniu nazwiska pojawia się błąd 'invalid numeric input'.

Problemem jest pętla w procedurze szukaj:

g:=dane[i].iloscartykulow;

for a:=1 to g do
begin
  readln(p, dane[i].nazwa[a]);
  readln(p, dane[i].cena[a]);
  readln(p, dane[i].ilosc[a]);
  readln(p, dane[i].razemart[a]);
end;

Pomimo wprowadzenia jednego produktu pętla szuka drugi raz, bo zmienna g przchowuje liczbę 2 pomimo tego, że wprowadziłem jeden artykuł; Program wywala się nie na wczytaniu nazwy do macierzy, a ceny;

Tak to jest właśnie, jak się struktury pakuje do pliku tekstowego... Skorzystaj z plików typowanych, a część problemów zniknie; Ten kod jest zagmatwany i ciężko się go analizuje, więc polecam użyć debugera do znalezienia reszty błędów;

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