przyczyna niezgodności

0

Witam,
Zwracam się do Was jako profesjonalistów. Jestem profanem PASCALA, mam problem z działaniem programu.
Problem dotyczy:
pobierania danych z pliku .txt (dane: liczby całkowite od 10 do 10000 ułożone w trzy kolumny rozdzielone spacją, liczba rzędów do ok.100. Kodowanie znaków - "unicode"). Kompilacja programu - bez uwag. Podczas wykonywania programu pojawia sie komunikat o kodzie 106.
Fragment: ...deklaracja zmiennych, którym przypisywane są odczytywane wartości i ... dalej...:
" var .... a,b,c,n: integer;
dat: text;
d,e,f,INT: array[1..100] of real; ((dane: d,e,f >>> winny być pobierane z pliku .txt))
.....
.....
write('liczba wierszy: '); readln(n);
for i:=1 to n do read(dat,d[i],e[i],f[i]); >>>> tu pojawia się błąd >>> code 106

Nie potrafie tego rozgryść lub poprawić.

Będę wdzięczny za podpowiedź

0

jak się koduje cyfry w unicode??
może byś tak dał ze 3 linijki z tego pliku

106 - Invalid numeric format

na 99.999% nie gra separator dziesiętny

0

Witam,
w załączeniu widok testowego pliku tekstowego. Czy jakieś inne informacje byłyby przydatne ?

sk1.jpg

sk2.jpg

sk1_2.jpg

0

więc tak po pierwsze jak go tak zapiszesz to na początku pliku pliku dostajesz dwa bajty FF FE. Po drugie w tym trybie każdy znak jest zapisany na dwóch bajtach - np. znak '1' jest zapisany jako 31 00. W pascalu tak tego nie odczytasz. Musiał byś czytać po dwa znak, pomijając pierwsze dwa znaki i potem z tych dwóch odczytanych wywalać drugi a z pierwszego składać stringa aż do napotkania spacji.

Zobacz sobie plik, który ma taką zawartość

123 456 456
123 333 333

tak naprawdę wygląda tak

FF FE 
znacznik unicode
31 00 32 00 33 00     20 00     34 00 35 00 36 00     20 00     34 00 35 00 36 00     0D 00 0A 00 
1     2     3         spacja    4     5     6         spacja    4     5     6         EOL
31 00 32 00 33 00     20 00     33 00 33 00 33 00     20 00     33 00 33 00 33 00
1     2     3         spacja    3     3     3         spacja    3     3     3
0

powinieneś czytać plik w formacie unicode, a czytasz zapewnie ascii.
jakiego używasz kompilatora?

W pascalu tak tego nie odczytasz
zależy jakim pascalu — nowsze wersje FreePascala i Delphi obsługują już conieco.

W najgorszym przypadku (Turbo Pascal) trzeba będzie czytać plik ręcznie: proponuję file of word.
Na początku pliku może występować znacznik, słowo o wartości $FEFF. Należy go zignorować.
Następnie każde czytane słowo to będzie jeden znak¹: jeśli wartość jest mniejsza niż 127, można go bezpośrednio rzutować na znak ASCII (char).
Wartości 128..255 to strona kodowa Latin-1 (ISO 8859-1). Dalsze znaki Unicode (powyżej 255), w tym polskie litery, nie mają bezpośredniego przełożenia na kodowanie ASCII/ANSI, potrzebne są tablice konwersji. U ciebie na szczęście potrzeba tylko cyfr (i spacji, i znaków nowej linii), więc wystarczy że będziesz czytał z pliku znaki jako word i jeśli są mniejsze niż 128 rzutował je na char (w przeciwnym razie traktuj jako spacje, albo np. '?').
Składanie znaków do liczby zrób za pomocą val() (albo lepiej floattostr() jeśli to FreePascal).

z tych dwóch odczytanych wywalać drugi
To zły pomysł, bo jeśli w pliku trafią się znaki unicode spoza ASCII, powinny być wyłapywane jako błędy, a nie przypadkowo traktowane jako prawidłowe cyfry.

¹) upraszczając, bo obsługa egipskich hieroglifów nie będzie nam potrzebna.

0

DZIĘKUJĘ za dotychczasowe uwagi - były (są) bardzo przydatne. Czytając inne posty i inne fora nie znalazłem wyjaśnienia swojego problemu. Nie jestem informatykiem (programistą) a Pascala poznaję z książek, forów, prób i ... błędów. Mam świadomość, że miejscami brakuje mi wiedzy i doświadczenia ... stąd może elementarne, ale dla mnie ZASADNICZE pytanie (wybaczcie jeżeli jest oznaką indolencji) >>>

??? = (#1) czy plik .txt (ten do odczytania przez program w pascalu, fragment w .jpg) może zawierać dane (być utworzony) w notatniku ???
jeżeli TAK - to jaki sposób kodowania powinien być wybrany? (z odpowiedzi wiem, że unicode byłby ... kłopotliwy)
czy też (#2) >>>
wymaga odrębnego, specjalnie utworzonego (np. programem pascalowym tworzącym taki plik)

podsumowanie: mam wrażenie że #2 jest prawodłowa i że nie jest możliwe tworzenie (implementowanie) danych za pośrednictwem notatnika.

Czy moje wyobrażenie jest słuszne ?

Ad kompilatorów:
dysponuję (i próbuję) - FreePascal oraz Turbo Pascal 7.0

0

zapisz z kodowaniem ASCII i będziesz miał w pliku to, co widzisz na ekranie :)

0

czy plik .txt (ten do odczytania przez program w pascalu, fragment w .jpg) może zawierać dane (być utworzony) w notatniku ???
tak, w ten sposób jak pokazałeś na screenshotach tworzysz plik w formacie Unicode (ściślej: UTF-16). Odpowiedzi kol. Misiekd i moja dotyczyły właśnie tak zapisanego pliku.
Standardowe readln nie radzi sobie z unikodem.

0

Dziękuję - rada Misiekd była słuszna (aplikacja pobiera i przetwarza - działa) :)

[choć przed napisaniem o pomoc próbowałem zapisów w różnych formatach - coś musiałem ... po(...kręcić)

Temat - WYCZERPANY

1 użytkowników online, w tym zalogowanych: 0, gości: 1