Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача с использованием стека.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
HalkW
Столкнулся с небольшой проблемой,а именно:
Задача:
Создать текстовые файлы, содержащие один текстовую, а другой числовую информацию (количество слов и чисел может быть неодинаковым). Используя стек, создать другой текстовый файл, в котором числа и слова чередовались и были бы записаны в обратном порядке ("лишние" числа или слова были бы записаны в конец файла).
Всё вроде бы хорошо,создаю файлы генераторами.Но вот вывод в третий файл меня смущает.Закодирован!
Текст программы:
uses crt;
type
ukaz = ^s;
s = record
tip : byte;
pole1:integer;
pole2:string;
next:ukaz;
end;
var
file2:file of string;
file1:file of integer;
fileo:file;
X,HEAD:ukaz;
a:integer;
b:string;
begin
clrscr;
assign(file1,'d:\file1.txt'); reset(file1);
assign(file2,'d:\file2.txt'); reset(file2);
assign(fileo,'d:\fileo.txt'); rewrite(fileo);
Head:=nil;
while (not eof(file1)) and (not eof(file2)) do
begin
if not eof(file1) then
begin
read(file1,a);
new(x);
x^.tip:=1;
x^.pole1:=a;
x^.next:=head;
head:=x;
end;
if not eof(file2) then
begin
read(file2,b);
new(x);
x^.tip:=2;
x^.pole2:=b;
x^.next:=head;
head:=x;
end;
end;
x:=head;
while x<>nil do
begin
if x^.tip=1 then blockwrite(fileo,x^.pole1,1)
else blockwrite(fileo,x^.pole2,1);
x:=x^.next;
end;
while not eof(file1) do
begin
read(file1,a);
blockwrite(fileo,a,1);
end;
while not eof(file2) do
begin
read(file2,b);
blockwrite(fileo,b,2);
end;
end.

---------------------------

М
Про теги не забываем...



И файлы:
Krjuger
Во первых заключите ваш код в соответствующие теги.Во вторых,а вы вообще каким паскалем пользуетесь и паскалем ли?В третьих,процедура blockwrite описывается следующим образом:
Цитата


Синтаксис

procedure BlockWrite(var F: File; var Buffer; Count: Integer);
procedure BlockWrite(var F: File; var Buffer; Count: Integer;
var RecordCount: Integer);

Описание
Процедура BlockWrite записывает Count записей из Buffer в двоичный файл. Если переменная RecordCount указана в аргументах процедуры, то BlockWrite сохраняет в ней количество фактически добавленных записей. Если диск переполнен или возникла другая ошибка, RecordCount может быть меньше Count.

Я думаю вам уже должно быть понятно,что это не совсем то, что вам нужно.потому что в результате вашей работы вы получите файл типа байл,а он уж никак не текстовый.поэтому при просмотре данного файла в обычном блокноте вы видите вместо желаемого результата всякие иероглифы.
И вообще текстовый файл это файл типа text,а все остальное это уже типизированные файлы.
volvo
Цитата
Во вторых,а вы вообще каким паскалем пользуетесь и паскалем ли?
Проблемы в чем? Код из первого сообщения (в отличие от приводимого обычно тобой, кстати) прекрасно компилируется любым Паскаль-компилятором, другое дело, что автор запутался в типах файлов, но это Паскаль в любом случае...

Добавлено через 4 мин.
Цитата
поэтому при просмотре данного файла в обычном блокноте вы видите вместо желаемого результата всякие иероглифы.
При записи кириллицы (или скажем псевдографики) в файл типа Text (и при просмотре этого файла блокнотом) ты тоже получишь вместо записанного всякие иероглифы, и что? Не веришь - спроси у пользователя sheka, он знает...
HalkW
Ну так вот,Паскаль это 7.1.Ну всмысле версия,а вот с выводом проблема.И если записывать в файл с помощью генератора,информация так же получается закодированной-не обязательно текстовый формат.
Krjuger
Цитата

При записи кириллицы (или скажем псевдографики) в файл типа Text (и при просмотре этого файла блокнотом) ты тоже получишь вместо записанного всякие иероглифы, и что? Не веришь - спроси у пользователя sheka

Знаю,сталкивался,но тут то реч немного о другом все таки...И давай не будем в каджой теме переходить на личности?Оке?Я спрашиваю ту информацию,которая мне необходима,чтобы помоч...Если у тебя таких вопросов не возникает,это уже сугубо твое дело.
Цитата

в файл с помощью генератора

Ты имееш в виду процедуру рандома при заполнении файла числами?.
Вот смотри,ты заполнил свой стек,у тебя есть записи типа строки и типа челых чисел.Все на этом твоя работа с твоими входными файлами должна закончится.Дальше ты береш идеш в начало стека,сначала читаеш из строковой части пишеш строку потом число,ну или наоборот,затем просто переходиш к следующиму элементу по твоей ^.next.так будеш делать пока не дойдеш до последнего.Но тут появляется маленькая загвоздка количество строк и чисел разное.Я думаю необходимо сделать проверку,если данная часть пуста то ничего не пишем,если что то есть то пишем.Надеюсь ты понял,что я предложил......
Lapp
HalkW, во-первых, тебе нужно все три файла объявить как text (ибо у тебя в условии они проходят как текстовые). Затем создай file1.txt и file2.txt в обычном блокноте, примерно так:
file1.txt
Код
aaaa bbbb cccc
ddd eeeeee ffffff
qwerty hjhjhjhjhj
sdfg hjhj
xcvb
asd bnbnbnbb

file2.txt
Код
1
2
3
4
5
4
34
46
7
8
56

Читать из этих файлов операторами Read и ReadLn.

Во-вторых, тебе потребуется процедура для чтения слова из файла (например, тут: Разбиение на слова. Все способы. ).
Попробуй это все сделать и приходи снова, если не получится.

Да, и не забывай закрывать файлы перед выходом оператором Close.
HalkW
После замены на text,нам будут недоступны процедуры блоквраит ?Задача услажняется?)
Лопарь
Цитата(HalkW @ 29.06.2009 14:04) *
После замены на text,нам будут недоступны процедуры блоквраит ?Задача услажняется?)
Зачем тебе blockwrite? Используй обычный write или WriteLn
Krjuger
Извини конешно,но чем она усложняется?что ты используеш блокврайт для записи 1 значения из строки и 1 значения из чисел,что ты будеш использовать обычные write writeln,ты все равно приимуществ блокврайта не особо используеш,а если выразится точнее,то блокфрайт может сразу целые блоки копировать(отсуда и его название),а ты все равно этого не делаеш.
Lapp
Цитата(Krjuger @ 29.06.2009 15:52) *
ты все равно этого не делаеш.
Если уж на то пошло, то правильнее будет сказать, что blockwrite использован совершенно неверно. Из целой переменной (два байта) записывался только один, а из строковой (256 байт) почему-то два байта..

HalkW, прочти внимательно условие и пойми, что это задание - на отработку именно файлов типа text. А они существуют не для усложнения, а для упрощения. Работать с на уровне blockwrite намного сложнее.

Добавлено через 5 мин.
Цитата(Lapp @ 29.06.2009 16:16) *
Из целой переменной (два байта) записывался только один, а из строковой (256 байт) почему-то два байта
Упс сорри, недогляд, не посмотрел на открытие файла. Правильно так: из целой записывалось 128 байт, а из строковой таки 256. Но - и с длиной, и с хвостом..)) Короче, ответ все равно один: используй text, Write и WriteLn.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.