Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с текст файлами 
:(
    Опции темы
Toohtik
Дата 11.3.2007, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 142
Регистрация: 30.1.2006
Где: Харьков

Репутация: нет
Всего: нет



Нужно написать прогу, которая создавала файл и записывала:
1.все слова в перевернутом виде;
2.строки в обратном порядке.

С первым я справился на ура, а вот со вторым проблемка. Вот код:
Код

program laba9;
uses crt;
procedure Slovo(n:integer; buf:string);
var i,j,na4:integer;
    f1:text;
begin
     na4:=1;
     assign(f1,'1.txt');
     rewrite(f1);
     append(f1);
     for i:=1 to n do
     begin
          if(buf[i+1]=' ') or (i=n)then
          begin
               for j:=i downto na4 do
               write(f1,buf[j]);
               na4:=i+1;
               writeln(f1,' ');
          end;
     end;
     close(f1);
end;
procedure Line;
var i:integer;
    n:integer;
    f1:text;
    f2:file of string;
    temp:string;
begin
     Assign(f1,'1.txt');
     Assign(f2,'2.txt');
     Reset(f1);
     Rewrite(f2);

     while(EOF(f1)<>TRUE) do
     begin
          readln(f1,temp);
          seek(f2,0);
          write(f2,temp);
     end;
     close(f1);
     close(f2);
end;
var
    buf:string;
    n:integer;
begin
     clrscr;
     writeln('Vvedite ctroky');
     readln(buf);
     n:=length(buf);
     Slovo(n,buf);
     Line;
     readln;
end.

Алгоритм таков: пользователь вводит строку с клавы, функция Slovo разбивает на слова переворачивает их и записывае построчно в файл 1.txt. Функция Line читает построчно из файла 1.txt и должна записать в 2.txt сначала последнюю строку потом предпоследню... 
Фактически функция Line работает, т.е. она записывает в обратоном порядке строки но она еще добавлят очень много мусора. В чем причина?

PM ICQ   Вверх
remax
Дата 11.3.2007, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: нет
Всего: 5



Код

procedure Line;
var 
    n:integer;
    f1,f2:text;
    temp1,temp2:string; 
begin
     Assign(f1,'1.txt');
     Assign(f2,'2.txt');
     Reset(f1);
     Rewrite(f2);
     while (not EOF(f1)) do
     begin
          readln(f1,temp1);
          temp2:='';
          for n:=1 to length(temp1) do
            temp2:=temp1[n]+temp2;
          writeln(f2,temp2);
     end;
     close(f1);
     close(f2);
end;

Пардон, не дочитал условие. Эта процедура переворачивает строки а не их порядок.
Сейчас набрасаю другой вариант-

Что-то в этом роде.  А использование file of string - в данном случае не допустимо, потому, что предполагает что все строки вашего файла состоят из 255 символов - а это не так.

Код

procedure Line;
var 
    n,i,fs:integer;
    f1:text;
    f2:file;
    temp1:string;
    temp2:array [1..257] of char; 
begin
     Assign(f1,'1.txt');
     Assign(f2,'1.txt');
     Reset(f1);
     Reset(f2);
     fs:=filesize(f2); {Размер исходного файла}
     close(f2); 
     Assign(f2,'2.txt');
     Rewrite(f2,1);
     while (not EOF(f1)) do
     begin
          readln(f1,temp1);
          n:=length(temp1);
          for i:=1 to n do
            temp2[i]:=temp1[i];
          inc(n,2);
          temp2[n-1]:=#13;
          temp2[n]:=#10;
          dec(fs,n);
          seek(f2,fs); 
          blockwriteln(f2,temp2,n);
     end;
     close(f1);
     close(f2);
end;


P.S. программа не проверялась и могут быть мелкие недочеты, но основная идея должна работать - записываем в нетипизированный файл, последовательно отступая от конца файла на длину строки.

Это сообщение отредактировал(а) remax - 11.3.2007, 14:18


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
Toohtik
Дата 11.3.2007, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 142
Регистрация: 30.1.2006
Где: Харьков

Репутация: нет
Всего: нет



Компилятор почемуто ругается на стрку blockwrite(f2,temp2,n); Eror101: Disk write error
PM ICQ   Вверх
remax
Дата 12.3.2007, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: нет
Всего: 5



Проверил - все понятно.
В строке 12 должно быть не   Reset(f2);
а   Reset(f2,1);  !!!!!

И еще один момент- По хорошему - надо проверять как закончилась программа - #13#10 или нет.
В первом случае - все нормально, а во втором - проблема, так как если эту строку ставить первой без разделителя - она сольется со второй, кроме того, это усложнит программу. Если не анализировать, (а при записи мы все время добавляем перевод строки) тополучиться что мы выйдем за размер файла на два символа - опять ошибка!
Поэтому. Предлагаю, по-тупому, в строке 12 
вместо fs:=filesize(f2); 
записать fs:=filesize(f2)+2; 

В результате ошибок не будет, но результирующий файл будет на 2 символа длинее...


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
Toohtik
Дата 12.3.2007, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 142
Регистрация: 30.1.2006
Где: Харьков

Репутация: нет
Всего: нет



О спасибо, заработалоsmile А такой вопрос что значит Reset(f2,1); т.е. для чего еще 1? #10 #13 как я понимаю EOL и EOF?

Это сообщение отредактировал(а) Toohtik - 12.3.2007, 10:27
PM ICQ   Вверх
remax
Дата 12.3.2007, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: нет
Всего: 5



1) При открытии нетипизированных файлов (типа file) необходимо указать размер записи (по умолчанию 256 байт). В реальных задачах, обычно, лучше использовать 1 байт.

2) #13#10 (перевод строки, возврат каретки) используются в текстовом файле для обозначения конца строки. Когда мы читаем в пременную типа string - эти символы игнорируются и в переменную не записываются. Поэтому, их надо восстанавливать. Если бы мы записывали в текстовый файл, то writeln позволил их записать автоматически. blockwrite - записывает только то, что в буффере.


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
volvo877
Дата 15.3.2007, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Toohtik, вопрос на засыпку? зачем понадобилось заморачиваться с File of String, вместо того, чтобы использовать ТОЛЬКО текстовые файлы? Ты что же думаешь, это невозможно? Ошибаешься... Смотри:

Код
procedure revert(var f, g: text; the_s: string);
var s: string;
begin
  if not eof(f) then begin
    readln(f, s);
    revert(f, g, s);
  end;

  if the_s <> '__END__' then
    writeln(g, the_s);
end;


var f, g: text;
begin
  assign(f, '1.txt'); reset(f);
  assign(g, '2.txt'); rewrite(g);
  revert(f, g, '__END__'); { <--- Здесь, в принципе, можешь передавать любую строку, которой не будет в файле}
  close(f);
  close(g);
end.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0756 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.