[pascal]wczytywanie z pliku słów oddzielonych spacjami

Awatar użytkownika
SK8
Użytkownik
Użytkownik
Posty: 213
Rejestracja: 29 sie 2007, o 10:18
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 29 razy
Pomógł: 36 razy

[pascal]wczytywanie z pliku słów oddzielonych spacjami

Post autor: SK8 »

Mam plik tekstowy dane1.txt z danymi w formacie:

Kod: Zaznacz cały

Nazwisko Imie Pesel
Musze wczytać te dane do odpowiednich pól tablicy rekordów. Nie wiem jaki kod napisać bo np. wczytywanie po pojedynczym znaku do wystąpienia spacji nie działa:

Kod: Zaznacz cały

program zad2;
uses crt;
const n=100;
type
    rosoba=RECORD
                nazwisko        :string[20];
                imie            :string[20];
    END;

    tosoba=ARRAY[1..100] of rosoba;

var
   dane1, dane2, dane3 :text;
   j                 :byte;
   tab                 :tosoba;
   c                   :char;
   str                 :string[20];

BEGIN
     clrscr; c:='x'; j:=1;

     Assign(dane1,'d:\dane1.txt');
     Assign(dane2,'d:\dane2.txt');
     Assign(dane3,'d:\dane3.txt');

     Reset(dane1); Reset(dane2); Rewrite(dane3);

     WHILE (not(eoln(dane1))) and (c<>' ') DO
           begin
           read(dane1,c);
           tab[1].nazwisko[j]:=c;
           j:=j+1;
           end;

     writeln(tab[1].nazwisko);
     readln;
END.

Po wyświetleniu na końcu tab[1].nazwisko jest puste miejsce. Może jest lepszy sposób lub co jest w tym źle?
abc666

[pascal]wczytywanie z pliku słów oddzielonych spacjami

Post autor: abc666 »

Yyy, z tego co pamiętam to read() bez problemów to wczyta, zmień twoje c na pole string, a read będzie czytać pojedyncze słowa, kolejno. Bez takich kombinacji.
Awatar użytkownika
SK8
Użytkownik
Użytkownik
Posty: 213
Rejestracja: 29 sie 2007, o 10:18
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 29 razy
Pomógł: 36 razy

[pascal]wczytywanie z pliku słów oddzielonych spacjami

Post autor: SK8 »

Właśnie tak nie działa bo odczytuje do końca linijki zamiast do spacji. Mam mieć tam tylko pierwsze słowo z linijki do spacji.
Awatar użytkownika
Inkwizytor
Użytkownik
Użytkownik
Posty: 4105
Rejestracja: 16 maja 2009, o 15:08
Płeć: Mężczyzna
Lokalizacja: Poznań
Podziękował: 1 raz
Pomógł: 428 razy

[pascal]wczytywanie z pliku słów oddzielonych spacjami

Post autor: Inkwizytor »

A nie powinno byc w tej pętli while po prostu:

Kod: Zaznacz cały

     WHILE not eof(dane1) DO
           begin
           read(dane1,c);
           if c= then (********)
           else
           tab[1].nazwisko[j]:=c;
           j:=j+1;
           end;
Powinny być dwie zagnieżdżone pętle. W zewnętrznej "jedzie" do końca pliku. W wewnętrznej do spacji. poczym przesuwa się do następnego rekordu by zapisac następny wyraz. U ciebie tak jakby maił to zapisac ciurkiem, chyba że to na próbę czy czyta pierwsze słowo
abc666

[pascal]wczytywanie z pliku słów oddzielonych spacjami

Post autor: abc666 »

Nie, całkowicie nie o to chodzi. Wczytywanie danych w linii rozdzielonych spacją jest naturalne i dostępne raczej w każdym języku. Po prostu tak.

Kod: Zaznacz cały

 WHILE not eof(dane1) DO
BEGIN
read(dane1,nazwisko,imie,pesel);
END;
Awatar użytkownika
SK8
Użytkownik
Użytkownik
Posty: 213
Rejestracja: 29 sie 2007, o 10:18
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 29 razy
Pomógł: 36 razy

[pascal]wczytywanie z pliku słów oddzielonych spacjami

Post autor: SK8 »

Niestety nic z tego nie działa. Zawsze wczytuje tyle znaków ile ma string a nie do spacji.
Awatar użytkownika
sneik555
Użytkownik
Użytkownik
Posty: 142
Rejestracja: 30 wrz 2009, o 10:48
Płeć: Mężczyzna
Lokalizacja: Piotrków Trybunalski
Podziękował: 4 razy
Pomógł: 28 razy

[pascal]wczytywanie z pliku słów oddzielonych spacjami

Post autor: sneik555 »

jeśli dobrze zrozumiałem, to masz w każdym z plików tekstowych oddzielnie imiona, nazwisa i te pesele?? jak tak, to ja bym to zrobił w ten sposób(jest to na tylko np. imie), reszte powinieneś potrafić zrobić sam;p

Kod: Zaznacz cały

assign(p,'d:\we.txt');
reset(p);

n:=1;
repeat
 repeat
  read(p,zn);

  if zn<>' ' then
   begin
    znaki:=znaki+zn;
   end
  else
    begin
     t[n].imie:=znaki;
     znaki:='';
    end;

 until eoln(p);
 read(p);
 n:=n+1;


 until eof(p);
 gotoxy(5,5);
 write(t[2].imie);
ODPOWIEDZ