logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Pascal] Jak wstawić enter co 28 znaków w pliku tekstowym?

Borelli 09 Maj 2010 11:00 1718 4
REKLAMA
  • #1 8053754
    Borelli
    Poziom 9  
    Posty: 44
    Witam.Muszę napisać program który po wczytaniu pliku tekstowego wstawi enter co 28 znaków i zapisze w nowym pliku.Byłbym wdzięczny jeśli pomożecie mi go poprawić, albo jakoś naprowadzić na dobrą drogę.Oto mój program
    uses crt;
     var ch:char;
         plik,plik1:text;
         i:integer;
      begin
      i:=0;
      assign(plik,'C:\QQ.txt');
      reset(plik);
       assign(plik1,'C:\0a.txt');
       rewrite(plik1);
       while(not eof(plik)) do
        begin
        readln(plik,ch);
        repeat
             i:=i+1;
         write(plik,ch);
          {if i=28 then
          write('lol'); }
         until eof(plik);
              end;
         close(plik1);
         close(plik);
         repeat until keypressed;
      end.

    A tu jest plik z którego ma to wczytywać.
    Link

    Proszę pamiętać o używaniu znaczników code. - arnoldziq
  • REKLAMA
  • #2 8054012
    mietekn
    Poziom 35  
    Posty: 1983
    Pomógł: 400
    Ocena: 161
    W skrócie:
    Zamiast:
    readln(plik,ch); 
    powinno być: by czytało jedynie znak.

    Wykasuj linię i
    until eof(plik); 
    bo się zapętliłeś ;)

    Zamiast:
    write(plik,ch);
    {if i=28 then
    write('lol'); }
    wpisz:
    if i=28 then writeln(plik1,ch)
    else begin
      write(plik1,ch);
      i:=0;
    end;

    Linię: można zastąpić:
    Tyle zauważyłem błędów "na szybko".

    PS. Zacznij używać tabulator. Dzięki wcięciom program staje się bardziej przejrzysty co ułatwia analizę.
  • REKLAMA
  • #3 8055424
    Borelli
    Poziom 9  
    Posty: 44
    Dzięki, ale mimo wprowadzonych przez Ciebie poprawek program dalej nie zapisuje wszystkie litery jedna po drugiej a ma być ze bo 28 literze ma przejść do następnej linii

    Dodano po 11 [minuty]:

    Poradziłem sobie!!!Dzięki za pomoc
    Zamieniłem:
    Cytat:

    if i=28 then writeln(plik1,ch)
    else begin
    write(plik1,ch);
    i:=0;

    Na:
    if i mod 28=0 then writeln(plik1,ch)
    else begin
    write(plik1,ch);
    [quote]
    I dzaiła wszystko Okey!!
  • REKLAMA
  • #4 8056526
    mietekn
    Poziom 35  
    Posty: 1983
    Pomógł: 400
    Ocena: 161
    Faktycznie moja pomyłka. Zamiast:
    if i=28 then writeln(plik1,ch)
    else begin
      write(plik1,ch);
      i:=0;
    end;
    Miało być:
    if i=28 then begin
      writeln(plik1,ch);
      i:=0;
    end
    else write(plik1,ch);
    Najważniejsze że sobie poradziłeś.
    Kod: "if i mod 28" itd jest dobrym rozwiązaniem ale tylko gdy plik wejściowy nie jest większy od 32767 (maksymalna wartość typu integer). Po 32767 znaku "i" zmienia się na -32768 i otrzymujemy błędną wartość "i mod 28". Poskutkuje to tym że przejście do nowej linii nastąpi w niewłaściwym miejscu.
  • #5 8062228
    Borelli
    Poziom 9  
    Posty: 44
    Ok dzięki temat zamknięty!!!
REKLAMA