[Pascal] "write" do pliku oraz zwykły tekst


(Archimond55) #1

Witam.

Chciałbym zapisać do pliku dwu-znakowe wyrażenie np. 'A1'

ale niestety nie jest to takie proste.

Aby program działał musiałem utworzyć zmienną typu string : A1.

c:char

kawałek kodu (program ma zamieniać wczytany znak z pliku 1 na inne wyrażenie do pliku 2)

np. wczytane "a" ma zapisać na "A1", a "b" na "B1"

while not eof(f1) do

		begin

		 read(f1,c);

		 if c='a' then

		 write(f2,A1[1],A1[2]) //tylko w takim wypadku działa, ale jeśli zrobię: write(f2,A1) to wyskakuje: Error 26: Type mismatch

		 else

			begin

			if c='b' then

			write(f2,'B','1') //lub write(f2,'B1') również nie działa, w obu przypadkach Error 20: Variable identifier expected

			end;

		end;

Czy tylko tym jednym sposobem można zapisać coś do pliku? Co jest nie tak?

Ułatwiłoby mi to życie gdybym ręcznie mógł podać co ma zostać tam wpisane w takim a takim wypadku.

Podejrzewam, że problem występuje ze zmiennymi - pewnie jakoś się gryzą :slight_smile:


(system) #2
Program zapis_do_pliku;

Uses crt;

const nazwa:string = 'Plik.txt';

      nazwa_:string = 'Plik1.txt';

Var

 pliktxt1, pliktxt2 : text;

{-------------------------------------------------}

procedure zapis_do_pliku(var pliktxt1 : text);

var znak_ : string;

    dl : byte;

Begin

 repeat

  writeln('Podaj 2 znaki : ');

  readln(znak_);

  dl:=length(znak_);

 until (dl <= 2);

 writeln(pliktxt1,znak_);

 writeln('----------------------------------');

 repeat

  writeln('Podaj 2 znaki : ');

  readln(znak_);

  dl:=length(znak_);

 until (dl <= 2);

 writeln(pliktxt1,znak_);

 close(pliktxt1);

End;

{------------------------------------------------}

procedure zamiana(var pliktxt2 : text);

var txt : string;

    dl,i : byte;

Begin

 dl:=0;

 reset(pliktxt1);

 rewrite(pliktxt2);

 while not eof(pliktxt1) do

  begin

   readln(pliktxt1,txt);

   dl:=length(txt);

   for i:=1 to dl do

    begin

     if (txt[i] = 'a') then

       write(pliktxt2,'A1')

     else

      write(pliktxt2,txt[i]);

    end;

  end;

 close(pliktxt2);

 reset(pliktxt2);

 while not eof(pliktxt2) do

  begin

   read(pliktxt2,txt);

   write(txt);

  end;

 close(pliktxt1);

 close(pliktxt2);

End;

Begin

clrscr;

 assign(pliktxt1,nazwa);

 assign(pliktxt2,nazwa_);

 rewrite(pliktxt1);

 rewrite(pliktxt2);

 zapis_do_pliku(pliktxt1);

 clrscr;

 zamiana(pliktxt2);

readln;

End.

Miałeś na myśli, coś o podobnych działaniu. Jak właśnie ten program?

Pozdrawiam

Protected_48


(Archimond55) #3

Dzięki, nieco mnie to naprowadziło, ale mam pytania:

-jeśli "użyłem do przypisania" plików ":FILE OF CHAR" to mogę zapisywać w nich tylko po 1 znaku na raz?

-czy zmienna typu "text" jest jakoś ograniczona (w sensie długości znaków), np. tak jak string?

A i mam taki jeszcze mały problem: używam Windows 7, jeśli chcę odczytać (bądź zapisać) plik z partycji systemowej (C:), to wywala mi błąd, że nie może go znaleźć - da się to jakoś ominąć bez zmieniania uprawnień?


(system) #4

U mnie działa bez problemu to :

Program p1;

Uses crt;

var plik : text;

    st : string;

Begin

clrscr;

 assign(plik,'C:\test.txt');

 reset(plik);

 while not eof(plik) do

  begin

   readln(plik,st);

   writeln(st);

  end;

 readln;

End.

Uważam, że do odczytu pliku tekstowego, czy zapisu nie są potrzebne uprawnienia administratora. Można to sprawdzić w cmd.exe lub PowerShell.exe poleceniem copy lub xcopy, w przypadku xcopy może faktycznie wystąpić odmowa dostępu, jeżeli nie ma się najwyższych praw w systemie.


(Archimond55) #5

Protected_48 , ja aktualnie używam Turbo Pascala, ten Twój powyższy program na nim działa i czyta z dysku C, a w moim nie : >

Różnicą jest tylko to, że u mnie muszę wprowadzić ścieżkę..

readln(sciezkaod); //sciezkaod:string

	writeln;

	Writeln('File path is now: ',sciezkaod);

	writeln;

	licznik:=0;

	Assign(f1,sciezkaod);

	{$I-}

	reset(f1);

	{$I+}

	if IOResult<>0 then begin Writeln('File Wasnt Found! Program will be close.'); delay(4000); halt; end;

Masz jeszcze jakiś pomysł? Z kolei kod programu nie działa na Freepascalu, a pewnie trochę musiałbym przerobić.


(system) #6

Posiadasz Windows'a 7, a używasz TP? Wiesz na twoim miejscu proponowałbym przesiąść się całkowicie na FPC.

Zmieniłem ten mój "program" tak, żeby pobierał ścieżkę od "użytkownika". Wygląda to tak :

Program p1;

Uses crt;

var plik : text;

    st,sc : string;

Begin

clrscr;

 writeln('Podaj sciezke pliku, ktory chcesz odczytac : ');

 readln(sc);

 assign(plik,sc);

 {$I-}

 reset(plik);

 {$I+}

 if IOResult<>0 then

  writeln('Plik nie istnieje')

 else

  writeln('Plik istnieje');

 while not eof(plik) do

  begin

   readln(plik,st);

   writeln(st);

  end;

 readln;

End.

Nie wiem, jak wprowadzasz ścieżkę. Powinno się podawać również rozszerzenie pliku C:\test.txt oraz normalne jest, że program wyjdzie z błędem 103, w przypadku błędnego otwarcia, znaczy wydaje się że mi pokazywano, jak tego uniknąć, jednak nie pamiętam, albo wydaje się mi że to jest możliwe. Zwracane wartości IOResult :

http://www.freepascal.org/docs-html/rtl/system/ioresult.html