Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2010, 12:11   #1
Oki
Новичок
Джуниор
 
Аватар для Oki
 
Регистрация: 01.11.2010
Сообщений: 3
По умолчанию Считывание и запись в файл

Прошу помочь с одной програмкой. Мне надо было написать програмку (Delphi) которая бы считывала текст из одного файла (*.txt) и записывала этот текст в другой но в другом должен стоять на лимит(не более 60 символов в строке) и остальное содержимое должно переноситься на следующую строку не разрывая слов. У меня есть основа этой программы, но она не входящий в пределы текст просто удаляет. Прошу помочь, вот код
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
files,files2:TextFile;
str,str2:string;
begin
str2:='';
if not FileExists('test.txt') then   exit;
AssignFile(files,'test.txt');
Reset(files);
while not Eof(files) do
  begin
    ReadLn(files, str);
     AssignFile(files2,'test2.txt');
     Append(files2);
        for i:=1 to length(str) do
        begin
        if i>60 then break;
          if str[i]<>' ' then
            str2:=str2+str[i] else
            str2:=str2+' ';
        end;
     Writeln(files2,str2);
     closefile(files2);
     str2:='';
  end;
closefile(files);
end;

end.

и ниже весь проект.
Вложения
Тип файла: rar прога.rar (163.1 Кб, 8 просмотров)
Oki вне форума Ответить с цитированием
Старый 01.11.2010, 12:51   #2
pray_driver
Форумчанин
 
Аватар для pray_driver
 
Регистрация: 18.08.2010
Сообщений: 140
По умолчанию

Цитата:
Сообщение от Oki Посмотреть сообщение
У меня есть основа этой программы, но она не входящий в пределы текст просто удаляет.
Код:
        if i>60 then break;
Ай чудак. ну естественно удаляет. Вы же сами пишете - дойти то 60 символа и break. Надо сначала придумать алгоритм, а потом уж кодировать.
например если дошли до 60 символа, то str2 сразу добавить в файл, затем занулить и продолжить в него вписывать (и так каждые 60 симоволов)

Я думаю код будет выглядеть примерно так (не проверял только на граничные значения, не помню, с какого символа нумеруется строка в паскале, с "0" или с "1")
Код:

    n := length(str); //длина строки
    k := n div 60 // сколько раз будем брать по 60
    k1 := n mod 60 // остаток

    j := 0; // начало цикла записывающего по 60 символов в строку
    Repeat
        str2 := '' // зануляем рабочую строку
        for i:= j * 60 to (j + 1) * 60 do   // записываем в str2 значения [0,60], [60, 120], [120, 180], ... до конца строки       
            str2 := str2 + str[i];
        writeln(files2, str2);
        inc(j);
    Until (j = k); 

    str2 := '';
    if k1 <> 0 then for i := k*60 to k*60 + k1 do // остаток если есть записать в строку
        str2 := str2 + str[i];
    writeln(files2, str2);
Люди бывают десяти типов: те, кто знают двоичную систему, и те, кто нет

Последний раз редактировалось Stilet; 01.11.2010 в 13:22.
pray_driver вне форума Ответить с цитированием
Старый 01.11.2010, 14:16   #3
Oki
Новичок
Джуниор
 
Аватар для Oki
 
Регистрация: 01.11.2010
Сообщений: 3
По умолчанию

Спасибо, получился в общем такой код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i, n, k, p, j:integer;
files,files2:TextFile;
str,str2:string;
begin
str2:='';
if not FileExists('test.txt') then   exit;
AssignFile(files,'test.txt');
Reset(files);
while not Eof(files) do
  begin
    ReadLn(files, str);
     AssignFile(files2,'test2.txt');
     Append(files2);
    n := length(str); //äëèíà ñòðîêè
    k := n div 60; // ñêîëüêî ðàç áóäåì áðàòü ïî 60
    p := n mod 60; // îñòàòîê
 
    j := 0; // íà÷àëî öèêëà çàïèñûâàþùåãî ïî 60 ñèìâîëîâ â ñòðîêó
    Repeat
        str2 := ''; // çàíóëÿåì ðàáî÷óþ ñòðîêó
        for i:= j * 60 to (j + 1) * 60 do   // çàïèñûâàåì â str2 çíà÷åíèÿ [0,60], [60, 120], [120, 180], ... äî êîíöà ñòðîêè
            str2 := str2 + str[i];
        writeln(files2, str2);
        inc(j);
    Until (j = k); 
 
    str2 := '';
    if p <> 0 then for i := k*60 to k*60 + p do // îñòàòîê åñëè åñòü çàïèñàòü â ñòðîêó
        str2 := str2 + str[i];

     Writeln(files2,str2);
     closefile(files2);
     str2:='';
  end;
closefile(files);
end;

end.
но проблема в том что он рвёт слова. Можно ли это как нить изменить?))

Последний раз редактировалось Oki; 01.11.2010 в 20:49.
Oki вне форума Ответить с цитированием
Старый 01.11.2010, 21:08   #4
Oki
Новичок
Джуниор
 
Аватар для Oki
 
Регистрация: 01.11.2010
Сообщений: 3
По умолчанию

Помогите плиз)
Oki вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Считывание и запись файла Paul_AG Общие вопросы C/C++ 3 27.02.2010 07:40
Считывание и запись в фаил Matr1x Общие вопросы C/C++ 8 01.12.2009 17:35
Считывание и запись структур в бинарный файл TheKnyazz Общие вопросы C/C++ 7 10.11.2009 13:47
Ещё запись в файл + считывание s-t-r-i-k-e-r Помощь студентам 3 03.06.2008 20:57
CreateFile - считывание дискеты в файл и обратная запись на нее... kalexi Win Api 1 01.10.2007 19:56