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.

[Pascal] Program - Enter po 28 znaku.

Borelli 09 Maj 2010 11:00 1328 4
  • #1 09 Maj 2010 11:00
    Borelli
    Poziom 9  

    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

    Code:
    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

    0 4
  • #2 09 Maj 2010 12:05
    mietekn
    Poziom 35  

    W skrócie:
    Zamiast:

    Code:
    readln(plik,ch); 
    powinno być:
    Code:
    read(plik,ch);
    by czytało jedynie znak.

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

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

    Linię:
    Code:
    i:=i+1; 
    można zastąpić:
    Code:
    inc(i);

    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ę.

    0
  • #3 09 Maj 2010 18:03
    Borelli
    Poziom 9  

    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);
    Cytat:

    I dzaiła wszystko Okey!!

    0
  • #4 09 Maj 2010 21:30
    mietekn
    Poziom 35  

    Faktycznie moja pomyłka. Zamiast:

    Code:
    if i=28 then writeln(plik1,ch)
    
    else begin
      write(plik1,ch);
      i:=0;
    end;
    Miało być:
    Code:
    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.

    0
  • #5 11 Maj 2010 12:28
    Borelli
    Poziom 9  

    Ok dzięki temat zamknięty!!!

    0