Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Текстовый файл. Странная ошибка


Автор: arcsupport 16.8.2010, 22:54
Добрый день. Есть подобный код:
Код

    while not eof(f) do
    begin
        FillChar(s, sizeof(s), 0);
        readln(f, s);
        if s = '' then continue;
        inc(n);
        .............
        k := 0;
        repeat
            FillChar(s, sizeof(s), 0);
            s := '';
            readln(f, s);
            if s <> '' then //// ***
            begin
                inc(k);
                .............
            end;
        until s = '';
    end;
Иногда, непонятно почему, условие, отмеченное ***, при пустой строке не срабатывает. С чем это связано?

Добавлено через 2 минуты
Т.е. выполняется if ****, и, кроме того, не выходит из repeat until.
В текстовом файле есть только русские и английские буквы, цифры, пробелы, точки, запятые. Больше ничего нет.

Добавлено через 4 минуты и 20 секунд
Кроме того:
Код

var
  n, k : integer;
  f : text;
  s : array [0..512] of char;
Используется Emarcadero Delphi 2010

Автор: Данкинг 16.8.2010, 23:34
Может быть, там не '', а ' ', т.е. пробелы лишние?

Автор: amsoft 17.8.2010, 08:24
Цитата(arcsupport @  17.8.2010,  01:54 Найти цитируемый пост)
Иногда, непонятно почему, условие, отмеченное ***, при пустой строке не срабатывает


по условию оно у тебя и не должно срабатывать при пустом значении

Автор: arcsupport 17.8.2010, 09:09
При пустой строке этот самый if не должен выполняться. А он выполняется.
Лишних пробелов точно нет.

Автор: Чoо 17.8.2010, 09:21
Цитата(amsoft @  17.8.2010,  08:24 Найти цитируемый пост)
по условию оно у тебя и не должно срабатывать при пустом значении

я думаю автор имел ввиду, что если массив s<>'', то переход на then происходит (хотя конструкция if then else всегда работает, только бывает не так как хочет автор) 
(кароч фигню я написал выше . Ну вобщем даже если в массиве ни чего нет, то происходит переход на then даже по условию s<>'')
а действительно при значении '' он бы вышел из цикла 
Код

until s = '';

а что бы выходил из цикла, надо дополнить условие (s='') or (eof(f))
вообще думаю там действительно пробел где-то затесался

Добавлено @ 09:24
arcsupport, покажите ваш текстовый файл, только зазипуйте его

Автор: arcsupport 17.8.2010, 10:05
Сделал StrPas(s) и все заработало. Странно.

Автор: Чoо 17.8.2010, 12:14
что-то мне интересно стало, почему так?
по идее, если сравнивать следующим образом x<>'', то аргумент справа будет иметь тип shortstring. если x:array [0..n] of char, то после 
Код

fillchar(x,sizeOf(x),0);

он будет иметь прежнюю длину n, а каждый элемент массива будет равен #0.
Опять же по идее, сравнивать напрямую массив символов и shortstring компилятор не даст. Может он перед сравнением преобразует один из аргументов к соотв. типу и производит дальнейшее сравнение?

***
ну вобщем без StrPas должно работать если сделать так:
Код

 ..............
            if s[0] <> #0 then //// ***
            begin
                inc(k);
                .............
            end;
        until s[0] = #0;
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)