Что такое Файл?
Но если создать файл в блокноте в формате юникод, то даже если менять его расширение, и блокнот и far как-то понимают что это юникод и автоматически спаривают байты в слова(word), хотя при просмотре в far'е шестнадцетиричного его кода - все такой же массив байтов.
А если на паскале написать простейшую программку, чтобы читала из этого файла и выводила на экран 1-ю строку(string), то она каждый байт расшифровывает одельно.
Можно ли, и если да то как, написать программку, чтобы она понимала такие особенности?
:rolleyes:
Файл - это именованая последовательность байт.
Означенные выше программы читают несколько начальных килобайтов файла и пытаются понять (работает некоторая эвристика) его формат, в зависимости от определенного формата выбирается представление.
Означенные выше программы читают несколько начальных килобайтов файла и пытаются понять (работает некоторая эвристика) его формат, в зависимости от определенного формата выбирается представление.
а программа на паскале:
assign(f,'...имя файла...');
reset(f);
c:=0;
repeat
read(f,ch);
inc(c);
until eof(f);
(где f:text; c:word; ch:char; )
в итоге выдает длину файла(переменная с) 58(байт)
С чем Это связано?
Цитата: FeelUs
реальная длина файла - 884 байта(442 символа юникода),
а программа на паскале:
assign(f,'...имя файла...');
reset(f);
c:=0;
repeat
read(f,ch);
inc(c);
until eof(f);
(где f:text; c:word; ch:char; )
в итоге выдает длину файла(переменная с) 58(байт)
С чем Это связано?
а программа на паскале:
assign(f,'...имя файла...');
reset(f);
c:=0;
repeat
read(f,ch);
inc(c);
until eof(f);
(где f:text; c:word; ch:char; )
в итоге выдает длину файла(переменная с) 58(байт)
С чем Это связано?
Вероятно с тем, что паскаль не понимает уникод. Во всяком случае такой подход к подсчету символов не корректен.
и юникод на это ни как повлиять не может,
почему паскаль считает, что после 58-го байта наступает конец файла, когда его реальная длина 884 байта:confused:
Цитата: FeelUs
если файл - это именованная последовательность байт,
и юникод на это ни как повлиять не может,
почему паскаль считает, что после 58-го байта наступает конец файла, когда его реальная длина 884 байта:confused:
и юникод на это ни как повлиять не может,
почему паскаль считает, что после 58-го байта наступает конец файла, когда его реальная длина 884 байта:confused:
Еще как может. Вы объявили f как text, а Паскаль (кстати, вы не сказали какой) не понимает уникод.
В Юникоде же значение одного из байтов символа запросто может быть 26. Например, последовательность из двух байтов со значениями 4 и 26 означает русскую заглавную букву "К".
- так чтоли:),
а раз символ 1Ah может встречаться во всех файлах, за исключением текстовых, можно ли, и если да то как, написать программку, чтобы она понимала, где символ 1Ah является концом файла, а где он является просто символом, и где реальный конец файла.
а насчет юникода я понимаю так:[INDENT]если он влияет на файл,[/INDENT][INDENT][INDENT]то в нем должен быть еще какой-то атрибут, в котором записано, юникод это или не юникод[/INDENT][/INDENT][INDENT]а если не влияет, то программы понимают, что это юникод, эвристически[/INDENT]
еще я заметил, что в юникоде первые два байта не интерпритируются как символ, и равны FEFFh, или FFh FEh(младший байт по младшему адресу)
А атрибут бывает.Иногда.В таких случаях файл начинается символами "яю"(вроде)
если файл объявить как file of byte, то в итоге получается ральная длина файла
Цитата: FeelUs
получается:
с точки зрения паскаля
файл - последовательность байтов, заканчивающаяся символом 1Ah,
а с точки зрения всего остального
с точки зрения паскаля
файл - последовательность байтов, заканчивающаяся символом 1Ah,
а с точки зрения всего остального
Нет, с т.з. паскаля text - файл с последовательностью байтов, заканчивающихся символом 1Ah или концом файла