Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Turbo Pascal] Błąd w kodzie programu

soulhudson 21 Maj 2010 20:33 1215 5
  • #1 21 Maj 2010 20:33
    soulhudson
    Poziom 12  

    Napisałem aplikacje, która ma zapisać dany tekst w danym pliku.txt i gdy ją uruchamiam wyłącza się po podaniu treści

    Code:
    program zapisywanie_danych;
    

    var
       plik:file of string;
       txt,nazwa:string;
    begin
    writeln('Tresc:');
    read(txt);
    writeln('Nazwa:');
    read(nazwa);
         assign(plik,nazwa);
         rewrite(plik);
         write(plik,txt);
         close(plik);
         readln;
    end.

    0 5
  • #2 21 Maj 2010 21:56
    arnoldziq
    Moderator Programowanie

    Spróbuj tak :

    Code:
    program zapisywanie_danych;
    

    var
       plik:file of string;
       txt,nazwa:string;
    begin
    writeln('Tresc:');
    read(txt);
    writeln('Nazwa:');
    read(nazwa);
         assign(plik,nazwa);
    {$I-}
         rewrite(plik);
    {$I+}
         write(plik,txt);
         close(plik);
         readln;
    end.

    0
  • #3 21 Maj 2010 22:25
    wrych
    Poziom 20  

    Na oko kod działa poprawnie i plik o podanej nazwie powstaje...
    Problem w tym, że wykonanie tej linii

    Code:
    read(nazwa);  

    jest następujące:
    - użytkownik wpisuje z klawiatury nazwę pliku, np. test.txt i naciska Enter
    - komputer zmiennej nazwa przypisuje łańcuch znaków test.txt
    - znak końca linii pozostaje w buforze
    - wykonuje się kod
    Code:
         assign(plik,nazwa); 
    
         rewrite(plik);
         write(plik,txt);
         close(plik);

    - procedura readln; odczytuje z bufora koniec linii i nie czeka na ponowne naciśnięcie klawisza Enter - i mamy zakończenie programu (end.)

    Aby tego unikąć zastąp read(nazwa); procedurą readln(nazwa); lub na końcu daj readln; jeszcze raz.

    Rada z postu powyżej, to wyłączenie obsługi błędów przed rewrite i ponowne włączenie po... -problemu NIE rozwiązuje!

    0
  • #4 22 Maj 2010 07:38
    soulhudson
    Poziom 12  

    Poprawiłem na readln i teraz gdy podam treść i wcisnę enter, ona pojawia się jako nazwa z jakimś znakiem specialnym na początku a kursor się wyśrodkowuje i dupa

    0
  • #5 22 Maj 2010 08:59
    ed-ek
    Poziom 34  

    Problem tkwi w deklaracji:

    Cytat:

    plik:file of string;

    W Pascalu max długość stringa wynosi 255 znaków. Jeżeli zadeklarujesz do zapisu string o mniejszej długości, utworzony plik zostanie uzupełniony zerami do 255.
    Deklaruj:
    Cytat:

    var plik:text;

    A żeby był ładny zapis pliku, plik zapisu np:
    Cytat:

    c:\test.txt

    Możesz też zmienić read na readln

    0
  • #6 22 Maj 2010 10:03
    wrych
    Poziom 20  

    Tak jak pisałem

    Cytat:
    Na oko kod działa poprawnie i plik o podanej nazwie powstaje...

    i nie zauważyłem jak zadeklarowałeś zmienną plik. Przy zapisie do pliku binarnego (deklaracja: var plik: file of string) dane możesz zapisywać tylko przy pomocy write(plik, dane) i odczytywać read(plik, dane) - zob. uwagi napisane przez ed-ek. Natomiast zapisując w pliku tekstowym (deklaracja: var plik: text) dostajesz dodatkowo możliwość operowania całymi liniami - zapis: writeln(plik, dane); odczyt: read(plik, dane);
    Przy czytaniu tekstów z konsoli lepiej jednak używać readln (usuwa z bufora koniec linii - naciśnięcie Enter).
    Aby dopisać na końcu pliku tekstowego (to tak na wszelki wypadek) stosujesz append(plik) zamiast reset(plik) - plik musi wcześniej istnieć.
    W przypadku pliku binarnego append(plik) należy zastąpić reset(plik); seek(plik, filesize(plik));
    Powodzenia w zmaganiach z plikami.

    0
  Szukaj w 5mln produktów