Технический форум

Технический форум (http://www.tehnari.ru/)
-   Delphi, Kylix and Pascal (http://www.tehnari.ru/f43/)
-   -   Вставка символа "конец строки" (Pascal) (http://www.tehnari.ru/f43/t36741/)

Tanusha 06.06.2010 02:21

Вставка символа "конец строки" (Pascal)
 
Здравствуйте уважаемые обитатели форума!

нужно вставить #10 (конец строки) через каждые 150 символов в нетипизированный файл.
если встречается #13 (enter), то далее отсчет символов начинать заново.
причем слова в тексте не должны разрываться, т.е. вставку делать перед следующим пробелом

кое-что нашла, но не могу понять, что такое in, и как его обозначить в var
Код:

var
f: file;
f2:file;
j,n:integer;
 
s:string
begin
assign(f, text.txt);
reset(f);
assign(f2, file1.txt);
rewrite(f2);
 
n:=0;
while n+150<length(s) do
begin
  for j:=n+150 to n+1 do
  begin
    if s[j]=' ' then
    begin
      in:=j;
      break;
    end;
  end;
  insert(#10,s,n);
end;
 
writeln(f2,s);
close(f);
close(f2);
end.

и это, кажется, для одной строки? а если для всех, то надо добавить цикл?
Код:

while not EOF(f) do

Vladimir_S 06.06.2010 09:39

Цитата:

Сообщение от Tanusha (Сообщение 343476)
Здравствуйте уважаемые обитатели форума!

нужно вставить #10 (конец строки) через каждые 150 символов в нетипизированный файл.
если встречается #13 (enter), то далее отсчет символов начинать заново.
причем слова в тексте не должны разрываться, т.е. вставку делать перед следующим пробелом

кое-что нашла

Уважаемая Танюша, прежде всего позволю себе дать Вам один совет. Осваивая программирование, старайтесь решать задачи самостоятельно, а не шарить по всяким помойкам в поисках "кое-чего". Взять хотя бы приведенный Вами листинг. Да он просто изобилует ошибками и неряшливостями! Начнем с начала:
Код:

f: file;
f2:file;
j,n:integer;
s:string

Для данной задачи следует использовать тип файла TEXT.
Идем дальше:
Код:

assign(f, text.txt);
reset(f);
assign(f2, file1.txt);
rewrite(f2);

Не пойдет! Параметром функции Assign является СТРОКОВАЯ переменная (полное, включая путь, имя файла), поэтому надо либо ввести такие переменные и присвоить им значения путей, например
Код:

var
 st:String;
begin
 st:='D:\text.txt';
 Assign(f, st);
end;

либо, если имя файла указывается явно, по крайней мере взять его в кавычки:
Код:

assign(f, 'text.txt');
Далее:
Код:

for j:=n+150 to n+1 do
Абсолютно бессмысленная запись, потому что при любом n справедливо условие n+150>n+1, следовательно цикл выполняться не будет (для нисходящих значений переменной цикла используется downto, но здесь это ни к селу, ни к городу).
Можно и дальше продолжать, но, я полагаю, достаточно.
Мне кажется, что программа должна выглядеть как-то так:
Код:

var
 f,f2: TEXT;
 n:Byte;
 s:string;

begin
 assign(f, 'D:\text.txt');
 reset(f);
 assign(f2, 'D:\file1.txt');
 rewrite(f2);

 Repeat
  ReadLn(f,s);
  If Length(s)>150 then
  begin
    n:=150;
    Repeat
    Inc(n);
    Until (s[n]=' ') or (s[n]=#13);
    If s[n]=' ' then  insert(#10,s,n);
  end;
  WriteLn(f2,s);
 Until EoF(f);
 close(f);
 close(f2);
end.

Попробуйте - если что-то не так, поправьте сами или напишите сюда.
Да, естественно, пути к файлам поставьте свои.

Tanusha 06.06.2010 15:58

Вложений: 1
Дело в том, что решила использовать нетипизированный тип файлов потому, что строки в моем случае привышают 255 символов. а в дальнейшем к этим строкам еще и добавляеются символы. вот и ищу выход, как разбить эти строки на более маленькие, чтобы можно было далее работать с текстовым типом.
может, конечно, есть другой выход, но пока в голову пришло только делить на более маленькие. а может Вы знаете, как увеличить эти 255?
Вложение 14491
попыталась переделать в нетипизированный, но при этом текст просто переносится без изменений
Код:

var
 f,f2:file of char;
 n:Byte;
 s:string;
 b:char;
begin
 assign(f, 'text.txt');
 reset(f);
 assign(f2, 'file1.txt');
 rewrite(f2);

 Repeat
Read(f,b);
  If Length(s)>150 then
  begin
    n:=150;
    Repeat
    Inc(n);
    Until (s[n]=' ') or (s[n]=#13);
    If s[n]=' ' then  insert(#10,s,n);
  end;
  Write(f2,b);
 Until EoF(f);
 close(f);
 close(f2);
end.


Vladimir_S 06.06.2010 18:21

Цитата:

Сообщение от Tanusha (Сообщение 343639)
Дело в том, что решила использовать нетипизированный тип файлов потому, что строки в моем случае привышают 255 символов. а в дальнейшем к этим строкам еще и добавляеются символы. вот и ищу выход, как разбить эти строки на более маленькие, чтобы можно было далее работать с текстовым типом.
может, конечно, есть другой выход, но пока в голову пришло только делить на более маленькие. а может Вы знаете, как увеличить эти 255?

Ну во-первых, если я правильно помню, типы файлов "Text" и "File of Char" абсолютно тождественны, можно и так, и так. Теперь что касается ограничения в 255 символов, то оно относится не к файлам, а к строкам, и значит в данном случае пользоваться строковыми переменными нельзя. В итоге у меня получилось как-то так:
Код:

var
 f,f2:file of char;
 n:Byte;
 b:char;
begin
 assign(f, 'D:\text.txt');
 reset(f);
 assign(f2, 'D:\file1.txt');
 rewrite(f2);
 n:=0;
 Repeat
  Repeat
  Inc(n);
  Read(f,b);
  Write(f2,b);
  Until (n=150) or (b=#13) or Eof(f);
  If b=#13 then n:=0 else
  If n=150 then
  begin
    Repeat
    Read(f,b);
    Write(f2,b);
    Until (b=' ');
    Write(f2,#10);
    n:=0;
  end;
 Until Eof(f);
 close(f);
 close(f2);
end.


Tanusha 06.06.2010 19:35

не работает. просто копирует текст без изменения
сначала не понравилась строка
Код:

Write(f2,#10);
но я ее заменила на
Код:

p:=#10;
Write(f2,p);

и все равно не работает

Vladimir_S 06.06.2010 19:47

Вложений: 2
Цитата:

Сообщение от Tanusha (Сообщение 343747)
не работает. просто копирует текст без изменения

Да нет, работать-то она работает:
Вложение 14503 Вложение 14504
К сожалению, в Вашем файле русский текст и под DOS кодировка не соответствует, но вставленные символы #10 (светлые на темном фоне) очень даже видны. Другое дело - как тот или иной редактор их обрабатывает, и вообще показывает или скрывает. Но задача, как видите, решена.

Tanusha 06.06.2010 19:52

попробую еще раз проверить

Tanusha 06.06.2010 20:58

не идет ни в какую. даже исправляла, чтобы он интеры вставлял. все равно никак.
пишу в Turbo Pascal
результат смотрю через блокнот. Уж интеры бы точно в блокноте отобразились.
Вы бы не могли выложить свой .pas файл

Vladimir_S 06.06.2010 21:15

Цитата:

Сообщение от Tanusha (Сообщение 343809)
не идет ни в какую. даже исправляла, чтобы он интеры вставлял. все равно никак.
пишу в Turbo Pascal
результат смотрю через блокнот. Уж интеры бы точно в блокноте отобразились.
Вы бы не могли выложить свой .pas файл

Так вот же он в #4 и выложен. Просто через copy-paste.
Боюсь, что блокнот тут не годится. В DOS я знаю, как увидеть символы, а вот в Windows... Сейчас кое-что попробую. Пока же могу посоветовать написать простенькую программку посимвольного чтения файлов и выдачи на экран их кодов (командой Ord(p)). Считать оба файла и сверить результаты.

Vladimir_S 06.06.2010 21:22

Так, проверил одну идею - работает. Если у Вас установлен пакет MS Office, то откройте оба файла WORD'ом и нажмите кнопку отображения символов. Увидите различия.


Часовой пояс GMT +4, время: 19:02.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.