IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

> Работа с потоком
18192123
сообщение 24.04.2008 14:05
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


В поток записана последовательность целых чисел. Найти минимум и максимум и поменять их местами, не используя дополнительных потоков.

Начала я с того, что попыталась сосчитать первое число, чтоб было с чем сравнивать...
Проблема в том, что если в файле одно число - то оно фиксируется и выводиться (в компонент Memo) как надо, но если больше - приложение вылетает с ошибкой " '1-е число из файла' is not a valid integer value"..
структура файла:
11
22
56
...
и т.д

Объясните, как исправить, чтоб отработало без ошибок?

procedure TForm1.Convert;
var
i, j, k: Word;
c: Char;
l,numb,min,max: Integer;
str:string;
f: Boolean;
S: TStream; // переменная потокового типа
begin
S := TFileStream.Create(FName, fmOpenReadWrite);
//загружаем в поток типа FileStream содержимое файла FName
//тело алгоритма
with S do
begin
Position := 0; // установка указателя потока в начало
i := 0;
k := Size; // в k - размер потока в байтах
Read(c,1);
j:=1;
while (c<>#10)and(i<=k-1) do
begin
inc(i);
inc(j);
str:=str+c;
read(c,1);
end;
min:=StrToInt(str);

memo1.Lines.Add(IntToStr(min));
end
end;




Сообщение отредактировано: 18192123 - 24.04.2008 14:14
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 27.04.2008 12:42
Сообщение #2


Гость






Цитата
А ещё у мея такой вопрос: я в отладчике обнаружила, что строки <...> попросту игнорируются отладчиком...почему так???
А почему они не должны игнорироваться? Ты что, где-то используешь mins/maxs? Нет... Вот когда будешь использовать - компилятор будет обрабатывать их изменение...

Вот отработавший код (для случая, когда min и max содержат одинаковое число цифр!!!):

...
//загружаем в поток типа FileStream содержимое файла FName
with S do begin

Position := 0; i := 0;
k := Size;

repeat
c := #0; str := '';
while (i < k) do begin
read(c, 1);
if c = #13 then break;

inc(i); str := str + c;
end;

numb:=StrToInt(str);
if numb<min then begin
min:=numb; pos_min := Position - length(str) - 1;
end;
if numb>max then begin
max:=numb; pos_max := Position - length(str) - 1;
end;

Read(c, 1); // read #10
until Position = Size;

Position := pos_min;
str := IntToStr(max);
for i := 1 to length(str) do begin
Write(str[i], 1);
end;

Position := pos_max;
str := IntToStr(min);

for i := 1 to length(str) do begin
Write(str[i], 1);
end;
end; // with

S.Destroy;
memo1.Lines.LoadFromFile(FName);
...
Если минимальное и максимальное числа состоят из разного количества цифр - придется извращаться дополнительно...
 К началу страницы 
+ Ответить 

Сообщений в этой теме
18192123   Работа с потоком   24.04.2008 14:05
volvo   Вот так: while (c<>#13)and(i<=k-1) do // ...   24.04.2008 16:03
18192123   Вот так: [code=pas]while (c<>#13)and(i<=...   24.04.2008 16:53
volvo   Во-первых, вот тут: Почему увеличиваешь на 1? Надо...   24.04.2008 17:25
18192123   А вообще, я бы сделал так: Спасибо за объяснени...   24.04.2008 18:14
18192123   Добавила нахождение позиций максимального и минима...   24.04.2008 19:48
18192123   И даже то, что дописала про нахождение позиций не ...   24.04.2008 22:09
18192123   Вот что я добавила:перезаписала на место максималь...   24.04.2008 22:31
18192123   Вот код для предыдущего сообщения.. procedure TF...   27.04.2008 12:30
volvo   А почему они не должны игнорироваться? Ты что, где...   27.04.2008 12:42
18192123   Если минимальное и максимальное числа состоят из ...   27.04.2008 13:03
volvo   Угу... Только следить за тем, чтобы копирование шл...   27.04.2008 13:11
18192123   ...то проще копировать символы "назад" ...   27.04.2008 13:18
18192123   Вот моя попытка разобрать случай, если кол-во цифр...   27.04.2008 15:13
18192123   Пожалуста, объясните, как избавиться от лишних циф...   27.04.2008 17:17
volvo   Лень запускать Дельфи :) , я сделал эмуляцию рабо...   27.04.2008 18:35
18192123   Снова я что-то напутала...Результаты работы прилож...   27.04.2008 19:34
volvo   ... delta := length(inttostr(max)) - length(intt...   27.04.2008 20:05
18192123   Что я делаю не так? :) Всё так)) Спасибо больш...   27.04.2008 20:36


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 19.07.2025 2:34
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"