Неверный числовой формат - PullRequest
       24

Неверный числовой формат

0 голосов
/ 10 февраля 2011

Так что в основном у меня есть запись, которая выглядит следующим образом

modulis = record
        kodas : string[4];
        pavadinimas : string[30];
        skaicius : integer;
        kiti : array[1..50] of string;
    end;

И я пытаюсь прочитать ее из текстового файла следующим образом:

ReadLn(f1,N);

for i := 1 to N do
    begin
        Read(f1,moduliai[i].kodas);
        Read(f1,moduliai[i].pavadinimas);
        Read(f1,moduliai[i].skaicius);
        for j := 1 to moduliai[i].skaicius do
            Read(f1,moduliai[i].kiti[j]);
        ReadLn(f1);
    end;

И файл выглядиткак это:

9
IF01    Programavimo ivadas 0
IF02    Diskrecioji matematika  1 IF01
IF03    Duomenu strukturos  2 IF01 IF02
IF04    Skaitmenine logika  0
IF05    Matematine logika       1 IF04
IF06    Operaciju optimizavimas 1 IF05
IF07    Algoritmu analize       2 IF03 IF06
IF08    Asemblerio kalba        1 IF03
IF09    Operacines sistemos 2 IF07 IF08

И я получаю 106 плохой числовой формат.Не могу понять, как это исправить, я не уверен, но я думаю, что это как-то связано с текстовым файлом, однако я скопировал текстовый файл из Интернета, поэтому он должен быть хорошим: |

Ответы [ 3 ]

1 голос
/ 10 февраля 2011

Поскольку вы объявили pavadinimas как строку [30], он читает 30 символов независимо от длины строки. Например, в следующей строке pavadinimas будет "Скайтменине логика 0" вместо просто "Скайтменине логика"

IF04    Skaitmenine logika  0
1 голос
/ 10 февраля 2011

Чтение строковых данных отличается от чтения числовых данных в Паскале.

С числами инструкция Read потребляет данные до тех пор, пока не достигнет пробела или конца файла.Теперь в этом случае пробел может быть символом пробела, символом табуляции, символом EOL.Поэтому, если в одной строке текста 2 числа, вы можете прочитать их одно за другим, используя два последовательных Read s.

. Я полагаю, вы уже знали это.

И я считаю,Вы думали, что это будет работать так же со строками.Но это не так, вы не можете прочитать два строковых значения из одной строки текста, просто используя две последовательные инструкции Read.Read будет использовать весь текст до EOL или EOF.После чтения строковой переменной присваивается столько символов, сколько она может содержать, а остальные данные выбрасываются в забвение.В этом отношении он по существу эквивалентен ReadLn.

Решение?Расположите все данные во входном файле в отдельных строках и лучше используйте ReadLn s вместо всех Read s.(Но я думаю, что последнее может быть ненужным, и перестановки входных данных может быть достаточно.)

В качестве альтернативы вам может понадобиться прочитать всю строку текста во временную строковую переменную, затем разделить ее вручную и назначитьчасти к соответствующим полям записи, не забывая также преобразовать числовые значения из string в integer.

Вы выбираете то, что вам больше подходит.

0 голосов
/ 10 февраля 2011

Я не программист на Паскале, но похоже, что поля в вашем текстовом файле не имеют фиксированной длины.Как вы ожидаете, что ваша программа будет разделять каждое поле во время чтения?

...