• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Вставка символа "конец строки" (Pascal)

  • Автор темы Автор темы Tanusha
  • Дата начала Дата начала

Tanusha

Ученик
Регистрация
5 Июн 2010
Сообщения
9
Реакции
0
Баллы
0
Вставка символа "конец строки" (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
 
Здравствуйте уважаемые обитатели форума!

нужно вставить #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.
Попробуйте - если что-то не так, поправьте сами или напишите сюда.
Да, естественно, пути к файлам поставьте свои.
 
Дело в том, что решила использовать нетипизированный тип файлов потому, что строки в моем случае привышают 255 символов. а в дальнейшем к этим строкам еще и добавляеются символы. вот и ищу выход, как разбить эти строки на более маленькие, чтобы можно было далее работать с текстовым типом.
может, конечно, есть другой выход, но пока в голову пришло только делить на более маленькие. а может Вы знаете, как увеличить эти 255?
Посмотреть вложение text.txt
попыталась переделать в нетипизированный, но при этом текст просто переносится без изменений
Код:
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.
 
Дело в том, что решила использовать нетипизированный тип файлов потому, что строки в моем случае привышают 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.
 
не работает. просто копирует текст без изменения
сначала не понравилась строка
Код:
Write(f2,#10);
но я ее заменила на
Код:
p:=#10;
Write(f2,p);
и все равно не работает
 
не работает. просто копирует текст без изменения
Да нет, работать-то она работает:
NC001.webp NC002.webp
К сожалению, в Вашем файле русский текст и под DOS кодировка не соответствует, но вставленные символы #10 (светлые на темном фоне) очень даже видны. Другое дело - как тот или иной редактор их обрабатывает, и вообще показывает или скрывает. Но задача, как видите, решена.
 
попробую еще раз проверить
 
не идет ни в какую. даже исправляла, чтобы он интеры вставлял. все равно никак.
пишу в Turbo Pascal
результат смотрю через блокнот. Уж интеры бы точно в блокноте отобразились.
Вы бы не могли выложить свой .pas файл
 
не идет ни в какую. даже исправляла, чтобы он интеры вставлял. все равно никак.
пишу в Turbo Pascal
результат смотрю через блокнот. Уж интеры бы точно в блокноте отобразились.
Вы бы не могли выложить свой .pas файл
Так вот же он в #4 и выложен. Просто через copy-paste.
Боюсь, что блокнот тут не годится. В DOS я знаю, как увидеть символы, а вот в Windows... Сейчас кое-что попробую. Пока же могу посоветовать написать простенькую программку посимвольного чтения файлов и выдачи на экран их кодов (командой Ord(p)). Считать оба файла и сверить результаты.
 
Так, проверил одну идею - работает. Если у Вас установлен пакет MS Office, то откройте оба файла WORD'ом и нажмите кнопку отображения символов. Увидите различия.
 
Просто дело в том, что далее я работаю с file1.txt(поидее он уже должен быть разбит на коротенькие строки) никак с нетипизированным, а как с текстовым и в нем все равно обрезаются строки
 
Так, проверил одну идею - работает. Если у Вас установлен пакет MS Office, то откройте оба файла WORD'ом и нажмите кнопку отображения символов. Увидите различия.

Сейчас попробую
 
В действительности, Ваша программа работает. Но не понятно почему после того как я объявляю файл текстовым в дальнейшей обработке, программа все равно обрезает строки. Ведь она не должна их обрезать? Или и вправду надо интеров везде наставить, чтобы она поняла, что строка заканчивается?
 
В действительности, Ваша программа работает. Но не понятно почему после того как я объявляю файл текстовым в дальнейшей обработке, программа все равно обрезает строки. Ведь она не должна их обрезать? Или и вправду надо интеров везде наставить, чтобы она поняла, что строка заканчивается?
Даже не знаю. Попробуйте.
 
Огромное спасибо! Все работает!
 
Последнее редактирование:
Назад
Сверху